Minicurso de R aplicado à manipulação de microdados do IPEDF

Thiago Mendes Rosa

09/08/2022

Agenda

Este minicurso de R será focado no tidyverse (universo “arrumado”), que conta com um conjunto de pacotes que auxiliam os pesquisadores a manipularem suas bases de dados, preparando-as para que análises possam ser realizadas. Ajustar a base de dados, geralmente, é a etapa que mais consome tempo em uma pesquisa. Portanto, ter uma ferramenta que torne essa tarefa mais eficiente é fundamental.

Informações mais aprofundadas sobre o tidyverse estão disponíveis livro R for data science.

Esse curso foi baseado nos cursos R pragmático e Curso de R, que podem ser consultados sempre que necessário. O livro R para cientistas sociais é uma outra boa fonte de informações. Para análise de dados com estatística aplicada, o livro Estatística Básica - Bussab e Morettin (2017) conta com um site com os exemplos apresentados no livro. O site do institute for digital research and education, da UCLA conta com valiosos tutoriais que podem ser consultados sempre que necessário para a aplicação de técnicas estatísticas no R. Para análise de pesquisas amostrais complexas, o site do Anthony Joseph Damico é uma formidável fonte de consulta (que contempla as pesquisas do IBGE).

Público-alvo

  • Estagiários do IPEDF.
  • Pesquisadores do IPEDF.
  • Pessoas do IPEDF com desejo de adquirir novos conhecimentos.

Requisitos básicos:

  • Noções de lógica de programação.
  • Noções básicas de estatística.
  • Noções básicas de inglês (para facilitar pesquisas e entendimento das funções).

Conteúdo:

  • Introdução ao R;
  • Projetos com controle de versão pelo Github;
  • Acesso ao banco de dados do IPEDF;
  • Carga da Pesquisa Distrital por Amostra de Domicílios 2021;
  • Introdução ao tidyverse;
  • Operador pipe, manipulação de textos com o pacote stringr e datas com o pacote lubridate;
  • Transformação de dados com dplyr e tidyr;
  • Visualização de dados com ggplot2;
  • Elaboração de mapas com auxílio do pacote sf;
  • Utilização dos pacotes survey e srvyr para pesquisas amostrais;
  • Elaboração de relatórios com o Rmarkdown.

Introdução

Como surgiu o R e quem o utiliza hoje?

Vídeo introdutório

Por que usar o R e não outros softwares?

  • O R é um sistema para estatística computacional e gráfica;

  • Um dos focos do R é análise de dados e a interatividade. Isso faz com que o R seja uma linguagem intuitiva e flexível;

  • Código aberto: sem pirataria!

  • Constantemente atualizado;

  • Comunidade ativa e cada vez mais ampla (estatística, economia, sociologia, psicologia, biologia etc.);

  • O R possui a possibilidade de adotar diversos pacotes. Estes pacotes são coleções de funções e/ou bases de dados desenvolvidos pela comunidade que utiliza a ferramenta. Os pacotes ficam disponíveis no CRANComprehensive R Archive Network – que nada mais é do que uma coleção de sites da linguagem R e seus documentos relacionados;

  • Versatilidade para integração com outras linguagens e ferramentas. Já é possível rodar python diretamente no RStudio (o RStudio está mudando de nome; acesse https://posit.co/ para mais informações);

  • As versões mais recentes do R podem ser baixadas neste site. Uma versão específica, e também gratuita e aprimorada da Microsoft para certas plataformas, está disponível neste site.

Debilidades do R

  • O R é, em muitos casos, preterido por programadores no desenvolvimento de aplicações (por exemplo, sua linguagem não se aproxima tanto da linguagem utilizada por esses profissionais quanto o python);

  • Para alguns pacotes, a documentação pode não ser tão clara ou detalhada quanto a existente em outras ferramentas (como o Stata, por exemplo);

  • Nem sempre é fácil interpretar as mensagens de erro. Nesses casos, o código aberto permite rastrear todos os passos executados, auxiliando as depurações;

  • Por ser uma ferramenta de código aberto, o suporte para problemas é baseado na comunidade. Não existe uma entidade que fique responsável por prover soluções. Contudo, a comunidade do R é muito ampla e prestativa, minimizando esse tipo de situação;

  • Também por ser código aberto, nem todos os pacotes recebem atualizações periódicas, podendo sofrer problemas de compatibilidade ou obsolescência ao longo do tempo;

  • A instalação de alguns pacotes e ferramentas podem ser complicadas, exigindo algum conhecimento mais avançado dos usuários conforme a plataforma utilizada;

  • Devido aos itens anteriores, a reprodutibilidade de alguns scripts pode ficar comprometida. Guardar informações da sessão em que o código foi executado pode mitigar essa situação (versão do R, da platarforma e dos pacotes utilizado). O gerenciamento centralizado do RStudio Server, por exemplo, contribui para minimizar esse tipo de ocorrência.

RStudio (futuramente Posit)

O RStudio é um ambiente integrado de desenvolvimento (integrated development environment – IDE) para a linguagem R e outras (como o Python). Ele ajuda a organizar os trabalhos desenvolvidos, dividindo os conteúdos em janelas. Ele, por exemplo, tem recursos que facilitam a escrita dos códigos (com atalhos de teclado e o recurso de autocompletar). Além disso, possibilita que algumas funções sejam utilizadas via point-and-click. Acesse essa página para maiores informações (em inglês).

Para baixar o RStudio, acesse este site.

Um recurso muito importante do RStudio, amplamente utilizado no IPEDF, é a possibilidade de criar projetos. Nossos projetos são conduzidos com controle de versão, por meio do Github.

RStudio Server

O IPEDF conta com o RStudio server, o que significa que você pode acessar e trabalhar de qualquer máquina conectada à rede do GDF diretamente do navegador. Clique aqui para acessar o servidor.

Uma vantagem de utilizar o Rserver é sua maior capacidade de processamento, quando comparado com as máquinas locais, contando atualmente com 32GB de memória RAM e um processador de 16 núcleos.

Além disso, os pacotes instalados para a realização de um projeto ficam disponíveis para os demais usuários do insituto, sendo periodicamente atualizados pelo administrador do servidor. Isso facilita a reprodutibilidade dos códigos escritos por outros usuários, auxiliando também na continuidade de pesquisas e projetos. Sempre que precisar instalar um pacote, comunique o administrador do servidor [ ou ] para que ele também fique disponível para os demais usuários. Caso você necessite um pacote que demande alguma atualização do servidor, contate o administrador do servidor explicando os detalhes.

Banco de dados do IPEDF

O IPEDF conta com um banco de dados com as principais pesquisas do instituto, já organizadas e prontas para uso, além de outras fontes de dados secundárias bastante utilizadas em pesquisas (e.g. IBGE). A vantagem de se utilizar um banco de dados centralizado é que todos os pesquisadores usam a mesma fonte de informação para a produção de relatórios, garantindo consistência aos produtos gerados.

Além disso, as bases utilizadas em um trabalho ficam à disposição dos demais pesquisadores do insituto, evitando o tráfego de informações localmente. Quanto mais usuários estiverem utilizando a mesma fonte de dados, mais fácil fica para validar as informações e proceder eventuais correções, beneficiando todos os usuários.

Atualmente, o banco conta com as seguintes bases de dados:

  • Pesquisa Distrital por Amostra de Domicílios;
  • Pesquisa Metropolitana por Amostra de Domicílios;
  • Pesquisa de Emprego e Desemprego;
  • Pesquisa Nacional por Amostra de Domicílios;
  • Pesquisa Nacional por Amostra de Domicílios Contínua;
  • Pesquisa Nacional por Amostra de Domicílios Covid;
  • Pesquisa de Orçamentos Familiares;
  • Pesquisa Nacional de Saúde;
  • Censo Demográfico;
  • Cadastro de empresas da Receita Federal;
  • Relação Anual de Informações Sociais – RAIS;
  • Cadastro Geral de Empregados e Desempregados – CAGED;
  • Censo escolar;
  • Prova Brasil;
  • Enem;
  • IPCA;
  • INPC;
  • Pesquisas 156;
  • Base de MEIs;
  • Dados de Sindrome Respiratória Aguda Grave – Ministério da Saúde;
  • Cadastros de endereços;
  • Finanças públicas anuais.

Algumas bases de dados são de acesso público, enquanto outras são de acesso restrito. Todos os usuários, por padrão, possuem permissão de leitura das bases públicas. Para as bases restritas, é necessário preencher um termo de responsabilidade de uso, informando o projeto, o período de uso e os produtos a serem gerados com as informações. Esse termo deve ser aprovado pelo gestor da informação, antes que o acesso seja liberado pelo administrador do banco de dados. Esse processo visa a resguardar a confidencialidade das informações. O processo deve ser realizado via SEI.

As informações armazenadas no banco de dados podem ser facilmente carregadas pelo R (ou na maioria dos demais pacotes estatístico), por conexão ODBC – acrônimo para Open Database Connectivity. O RStudio server já está configurado para fazer esta conexão, enquanto as máquinas locais podem ser facilmente configuradas seguindo esses passos. As bases são acessadas com o pacote RODBC ou DBI, através de consultas SQL (Structured Query Language), que nada mais é que uma linguagem estruturada para realizar consultas em bancos de dados.

GitHub

O GitHub é uma plataforma online de compartilhamento e armazenamento de códigos. Os projetos do GitHub são baseados no git, uma ferramenta de versionamento de software.

A Codeplan utiliza o GitHub (ou o GitLab) para gerenciar e versionar seus projetos, de modo a mantê-los organizados e atualizados, sem o risco de perder informações acidentalmente ou por alguma falha técnica. Outra vantagem é a característica colaborativa da plataforma, permitindo o acesso aos códigos de qualquer lugar, via internet, por outros pesquisadores. Se o repositório for público, qualquer pessoa pode contribuir com os projetos, proporcionando ganhos a todos os futuros usuários.

Caso você não tenha conta, aproveite essa oportunidade para criar uma no Github. Vale lembrar que todos os pacotes desenvolvidos no R ficam armazenados no GitHub e são de acesso público para qualquer usuário. Assim, você pode consultar a programação de todas as funções existentes no R e em todos os seus pacotes (nada de caixa preta!).

RMarkdown

O Markdown é um sistema para tornar a escrita e a leitura de textos mais simples. Ele adiciona as formatações correspondentes à estrutura na qual você deseja apresentar seu texto. Tudo isso é feito de maneira simplificada, através de símbolos de teclado.

No R, o RMarkdown, é um tipo de documento especial que contém tanto textos, no formato markdown, quanto códigos, em R. Os códigos em R (ou em outras linguagens de programação) podem ser inseridos diretamente no texto, entre dois acentos graves e seguidos da letra r, ou separados em estruturas específicas (chunks). Os códigos são executados sempre que o documento é processado para algum formato específico, que pode ser HTML (como esse documento que você está lendo), em PDF (formato \(\LaTeX\)) ou mesmo microsoft Word. Apresentações de slides também podem ser facilmente realizadas com o Rmarkdown, nos formatos HTML, PDF (\(\LaTeX\)) ou microsoft Power Point.

Alguns relatórios e apresentações do IPEDF são produzidos em RMarkdown. Apresentações da pesquisa 156 e os relatórios da PDAD 2018 e PDAD 2021 foram produzidos com esta ferramenta.

Suas principais vantagens são a velocidade, reprodutibilidade e eficiência na produção destes relatórios. Por exemplo, a produção de relatórios para 33 Regiões Administrativas do DF, a partir dos dados da PDAD 2021, ficou muito mais rápida e padronizada.

Para detalhes sobre como utilizar o RMarkdown, acesse esse e esse sites (em inglês).

Preliminares

Como instalar o R em uma máquina

Para instalar o R, acesse o site do R-project. Escolha sua plataforma e siga os passos para efetuar a instalação.

Se o seu sistema operacionar for Windows, baixe o R base e efetue e instalação. Para instalar alguns pacotes, você irá precisar instalar o Rtools. Baixe a versão adequada para o seu sistema e efetue a instalação.

Atenção: alguns pacotes necessitam a instalação de outros softwares. Caso algum pacote apresente erro durante a instalação, verifique as mensagens exibidas no console, consulte a documentação do pacote e verifique se os requisitos estão sendo atendidos.

Por fim, baixe e instale o RStudio.

Estrutura do RStudio Server

O primeiro passo é efetuarmos o login no RStudio server do IPEDF. Para isso, acesse o site do servidor.

Entre com suas credenciais (u seguido de sua matrícula) e faça o login.

O RStudio server estará dividido em quatro painéis (ou três, caso seja seu primeiro login): o superior à esquerda apresenta os scripts abertos para uso; o inferior à esquerda apresenta o console, local onde os comandos e seus resultados são apresentados. Nesse painel, há também uma aba para o terminal do Linux e uma aba Background Jobs, na qual você pode rodar scripts sem que sua sessão atual seja afetada; o superior direito apresenta o ambiente, com os objetos ativos na sessão. Há mais cinco abas, com o histórico dos comandos executados, as conexões, build (para desenvolvimentos), o Git (se você estiver no ambiente de projetos) e uma aba Tutorial com a qual você pode aprender algumas funcionalidade do R; por fim, o inferior direito apresenta o diretório de trabalho, com as pastas e arquivos. Há ainda mais quatro abas, que apresentam os plots gerados, os pacotes disponíveis na biblioteca, a janela de ajuda e a janela de visualização (utilizadas por alguns pacotes para mostrar conteúdos da web ou em html).

Na parte superior, existe uma barra de tarefas, com a qual você pode criar novos scripts, projetos, abrir arquivos, executar buscas etc. São formas de você executar funções por point-and-click. Por exemplo, você pode alterar a visualização do RStudio server em Tools -> Global Options... -> Appereance, ou a disposição das janelas em View -> Panes.

Por todos os painéis existem atalhos úteis para executar diversas tarefas (abrir um novo script, criar um novo projeto, salvar o script atual, criar uma nova pasta etc.). Aproveite para conhecer essas opções.

Pacotes

Uma das funções mais básicas é instalar e carregar um pacote no R. Por exemplo:

#install.packages("tidyverse") # Instalar o pacote "tidyverse"
library(tidyverse) # Carregar o pacote "tidyverse"

# Siga os passos abaixo para instalar os pacotes utilizados nesse curso
# pacotes <- c("tidyverse","data.table","Hmisc","lubridate",
#              "ggrepel","sf","sidrar","survey",
#              "srvyr","scales","ggthemr","readxl",
#              "kableExtra","psych","xtable")


# if(length(setdiff(pacotes,installed.packages()))==0){}else{
#   
#   install.packages(setdiff(pacotes,installed.packages()))
#   
# }

#devtools::install_github('cttobin/ggthemr')

Note que o caractere # é utilizado para escrever comentários na codificação. Documentar bem seu código é fundamental para que as pessoas que trabalham com você entendam o que foi realizado. Além disso, é fundamental para que uma tarefa que dependa desse código possa ser executada ou alterada por outro pesquisador. Lembre-se que tudo o que produzimos é público e deve ser o mais acessível possível para qualquer pessoa! Para comentar uma série de linhas ao mesmo tempo, utilize o atalho Ctrl+Shift+C após selecioná-las.

Dica: para alterar várias linhas de uma só vez, segure a tecla Alt e use o cursos para selecionar as linhas. Desse modo, você conseguirá editar mais rapidamente seus scripts que demandam repetição de termos. Para mais dicas, acesse esse site, por Paweł Przytuła.

Tão importante quanto utilizar um pacote é citar ele no seu trabalho. Para tanto, utilize a função citation().

citation("tidyverse")

Operadores básicos

Dentro do R, alguns operadores básicos são constantemente utilizados. Os mais comuns são:

Operadores aritiméticos
Operadores Descrição
Adição
Subtração
Multiplicação
/ Divisão
^ ou ** Exponenciação
%% Resto da divisão
%/% Divisão inteira
Operadores lógicos
Operadores Descrição
< Menor
<= Menor ou igual
> Maior
>= Maior ou igual
== Exatamente igual a
!= Não é igual a
!X Não X
X|Y X ou Y
X&Y X e Y
Operadores de atribuição de valor
Operadores Descrição
x <- valor Atribuir ‘valor’ a ‘x’
x <<- valor Atribuir ‘valor’ a ‘x’
valor -> x Atribuir ‘valor’ a ‘x’
valor ->> x Atribuir ‘valor’ a ‘x’
x = valor Atribuir ‘valor’ a ‘x’

Algumas teclas de atalho podem ser bastante úteis na hora de escrever os códigos. Veja algumas das principais:

  • Ctrl+enter: roda a linha selecionada no script, enviando-a para o console. Um dos atalhos mais utilizado.
  • Ctrl+shift+M: (%>%) operador pipe.
  • Ctrl+1: altera cursor para o script.
  • Ctrl+2: altera cursor para o console.
  • Ctrl+Alt+I: cria um chunk dentro de um arquivo RMarkdown.
  • Alt+Shift+K: janela com todos os atalhos disponíveis.
  • Alt+seleção com mouse: permite que você altere várias linhas de uma única vez.

Agora vamos realizar algumas operações matemáticas básicas com o R. Digite diretamente no console (ou abra um script e escreva os códigos) e utilize o atalho de teclado para rodar o código (você pode também rodar o código com o botão “Run” na parte superior da janela de script).

1 + 2 # Adição
3 - 1 # Subtração
2 * 2 # Multiplicação
1 / 4 # Divisão

O R também realiza testes lógicos. Vamos testar alguns deles.

2+2==4 # 2 + 2 é igual a 4?
2+2==5 # 2 + 2 é igual a 5? 
2+2&1+3==4 # 2 + 2 e 1 + 3 são iguais a 4?
2+2|1+4==5 # 2 + 2 ou 1 + 4 são iguais a 5?

No último exemplo testamos se alguma das duas expressões era verdadeira. Para testar cada uma separadamente, precisamos de uma função de entrada de vários argumentos simultaneamente. A função utilizada para combinar é a c(), na qual seus argumentos são separados por vírgulas. Vamos refazer o último exemplo.

c(2+2,1+4)==5 # 2 + 2 é igual a 5? 1 + 4 é igual a 5?

Agora, o R testa separadamente os dois casos.

Utilizar chamada de funções

As funções no R são palavras específicas seguidas de parenteses (). Algumas delas estão sempre disponíveis no R (como as base functions), enquanto outras estão apenas quando os pacotes são carregados. Vamos ver as funções de soma sum() e de multiplicação prod().

sum(1,2) # Adição
prod(2,2) # Multiplicação

Algumas funções podem ser chamadas diretamente de seus pacotes, sem que seja necessário carregá-lo. Para isso, escreva o nome do pacote instalado, seguido do símbolo ::.

psych::describe(c(1,2)) # Utilizando a função describe, do pacote "psych", sem carregá-lo

Apesar de ser necessário digitar mais caracteres para obter o resultado, chamar funções desta maneira apresenta duas vantagens. A primeira é que fica claro, em cada passo, qual o pacote está sendo utilizado para executar determinada tarefa. Em segundo lugar, caso exista algum outro pacote com uma função de mesmo nome, não haverá o risco de utilizarmos a função errada para o problema que estamos tratando.

Criar uma função

Você pode criar suas próprias funções do R. Por exemplo, ao invés de utilizar a função de soma sum, nós podemos criar nossa própria função para somar dois valores.

# Função para somar dois valores
somar <- 
  
  # Abrir argumento para criação de função e informar dentro dos parenteses os parâmetros
  function(x,y){
    
  # Construir a operação de soma
  z = x + y
  
  # Retornar o resultado
  return(z)
  
  }
#Aplicar a função
somar(2,4)

No caso acima, determinamos que a função deve ser dois argumentos, x e y, os quais serão somados e atribuídos a variável z, que, por sua vez, será apresentada com a função return().

Tipos de dados

O R cria seus objetos em diversas classes e tipos. Para as classes, elas podem ser: lógica, inteiro, numérico, complexo ou caractere. Vamos olhar alguns exemplos:

x <- 1L # inteiro
class(x)
x <- 1 # numérico
class(x) 
x <- 8i # complexo
class(x)
x <- TRUE # lógico
class(x)
x <- "hello" # character
class(x)

Sobre os tipos, que dizem respeito à estrutura de como as informações são organizadas, temos, entre outros: vetor, lista, matriz, data frame,tibble, fator e tabela. Vejamos primeiramente o vetor, o mais simples deles.

x <- c(1,2,3) # Vetor numérico
typeof(x) # Checar o método de armazenagem
class(x) # Checar a classe
length(x) # Checar o tamanho
str(x) # Checar a estrutura

Entre as classes de objetos, sempre que você tentar misturar elementos distintos, o R irá forçar a conversão do vetor para uma classe única. Ele segue a seguinte regra:

DOMINANTE character > complex > numeric > integer > logical RECESSIVO

As classes de um vetor poder ser alteradas com as seguintes funções:

x <- 1:10
class(x)
as.numeric(x)
as.logical(x)
as.character(x)

Caso o R não consiga converter algum elemento entre as classes, ele emitirá um aviso, colocando um valor ausente em seu lugar (NA - Not Available).

Agora vamos ver uma matriz.

x <- matrix(ncol = 2,nrow = 2) # Criar uma matriz  2 x 2
dim(x) # Checar as dimensões da matriz
x[,] <- c(1,7,9,6) # Atribuir valores à matriz
x <- 1:3 # Contruir um vetor x
y <- 10:12 # Construir um vetor z
z <- cbind(x,y) # Montar uma matriz a partir destes vetores (por colunas)
z <- rbind(x,y) # Montar uma matriz a partir destes vetores (por linhas)

Temos algumas operações úteis para matrizes, como transpor e inverter.

m <- matrix(1:4,ncol = 2,nrow = 2) # Construir a matriz m
n <- matrix(5:8,ncol = 2,nrow = 2) # Construir a matriz n
t(m)      # matriz transposta de m
m %*% n   # multiplicação matricial de m por n
solve(m)  # matriz inversa de m

A lista é um tipo de objeto que pode armazenar diferentes classes em um mesmo local.

lista <- list(1,"galo",2i,2.61,TRUE,matrix(1:4)) # Criar uma lista
lista # Checar a lista criada
lista[[2]] # Acessar o segundo elemento da lista
lista <- list(a=1,b="galo",c=2i,d=2.61,e=TRUE,f=matrix(1:4)) # Criar uma lista, com nomes dos elementos

Os fatores são particularmente importantes para a apresentação dos dados e para regressões. Eles servem para tratar vetores categóricos ou enumeráveis. Vamos ver um exemplo, utilizando logo após a função table(), para fazer uma tabulação simples dos valores.

# Construir um fator
x <- factor(c("sim","sim","sim","não","sim","não"),levels = c("não","sim")) 
table(x) # Tabular os dados
levels(x) # Verificar os níveis dos fatores
class(x) # classe do objeto

# Construir um fator ordenado
x <- factor(c("ruim","bom","ruim","péssimo","ótimo"),
            levels = c("péssimo","ruim","bom","ótimo"),
            ordered = TRUE)
table(x) # Tabular os dados
levels(x) # Verificar os níveis dos fatores
class(x) # classe do objeto

# Construir um fator de variáveis com códigos
x <- factor(c(1,1,2,1,2,1,2),
            levels = c(1,2),
            labels = c("Sim","Não"))

table(x) # Tabular os dados
levels(x) # Verificar os níveis dos fatores
class(x) # classe do objeto


x <- factor(c(1,1,2,1,2,1,2,3,4),
            levels = c(4,3,2,1),
            labels = c("péssimo","ruim","bom","ótimo"),
            ordered = TRUE)
table(x) # Tabular os dados
levels(x) # Verificar os níveis dos fatores
class(x) # classe do objeto

As estruturas dos data frames e tibble, focos deste curso, serão tratadas em detalhes mais adiante, quando começarmos a manipular a PDAD 2021.

Para finalizar, temos alguns números/valores especiais no R: -Inf, Inf, NA e NaN. Os dois primeiros se referem ao infinito em ambas as direções, enquanto os dois últimos são os valores ausentes. Enquanto o NaN se refere a valores “não numéricos”, funcionando como nulo, os valores ausentes propriamente ditos são da forma NA, podendo assumir diferentes classes. Há ainda o objeto da classe NULL, que seria um objeto vazio. Usualmente ele é utilizado em definições de listas com tamanho zero.

Controles de fluxo

Temos algumas estrutura que testam condições e estabelecem fluxos no R. São exemplos os condicionantes if, else, for e while.

Podemos fazer um teste lógico para que o R execute uma soma quando uma condição é atendida. Vejamos uma aplicação do if.

# Criar um objeto com x com o valor 2
x <- 2
# Realizar uma soma se x é igual 2
if(x==2){
  
  x+2
  
}
# Realizar uma soma se x é igual a 3
if(x==3){
  
  x+2
  
}

Agora vamos usar o condicionante if juntamente com o condicionante else.

# Atribuir o valor 8 à x
x <- 8
# Testar se x é positivo ou negativo
if(x < 0) {
  
  "negativo"
  
} else if(x == 0) {
  
 "zero"
  
} else if(x > 0) {
  
  "positivo"
}


# Outra maneira de escrever o código
#if(x<0){"negativo"}else if(x==0){"neutro"}else if(x>0){"positivo"}

Note que, sempre que um novo condicionante é adicionado, o RStudio adiciona uma seta para baixo (quando se passa para uma próxima linha), indicando onde se inicia o novo fluxo.

O operador for é utilizado para realizar uma tarefa baseada em uma lista de valores. Vamos somar uma unidade aos valores listados entre 5 e 10.

# Criar uma lista de índices
i <- 1:10
# Somar 1 aos valores de 5 a 10
for(i in c(5:10)){
  
  print(i+1)
  
}

Por fim, temos condicionante while. Ele executa a tarefa até que uma certa condição seja satisfeita. Por exemplo, vamos somar duas unidades a x enquanto o resultado é menor ou igual a 10. Esse condicionante pode ser utilizado, por exemplo, para a maximização de funções.

x <- 1
while (x<=10) {
  
 print (x)
 x=x+2
  
}

Operador Pipe

Com o R, nós podemos “aninhar” várias funções ao mesmo tempo. Por exemplo, se alguém quiser somar um vetor de números, tirar a raiz quadrada e arrendondar o resultado, podemos fazer tudo isso em uma única linha de comando.

x <- c(1:10) # Criar o vetor numérico
round(sqrt(sum(x))) # Calcular a raíz quadrada da soma do vetor x, arredondando o resultado

Todavia, aninhar várias funções ao mesmo tempo, em algumas situações, pode deixar o código confuso. Vejamos um exemplo de função hipotética para preparação de um bolo.1

# esfrie(asse(coloque(bata(acrescente(recipiente(rep("farinha", 2), "água", "fermento", "leite", "óleo"), "farinha", até = "macio"), duração = "3min"), lugar = "forma", tipo = "grande", untada = T), duração = "50min"), "geladeira", "20min")

Dentro de um mesmo código, é possível indentar as linhas, sempre que um novo argumento da função precisa ser separado por vírgula.

# esfrie(asse(coloque(bata(acrescente(recipiente(rep("farinha", 2), 
#                                                "água", "fermento", 
#                                                "leite", "óleo"), 
#                                     "farinha", até = "macio"), 
#                          duração = "3min"),
#                     lugar = "forma", tipo = "grande", untada = T), 
#             duração = "50min"), "geladeira", "20min")

Mesmo assim, ainda resta alguma dificuldade para ler e entender o código de uma maneira mais clara e fluída. O operador pipe %>% é utilizado para facilitar a programação e a leitura, deixando o código mais arrumado. Ele realiza o seguinte comando, de maneira bastante intuitiva: “use o resultado do lado esquerdo como argumento da função do lado direito”. Para utilizá-lo, é necessário carregar algum pacote que leve o operador. Ao carregar o tidyverse, por exemplo, você já estará apto a utilizar o pipe (originalmente disponível com o pacote magrittr).

Vamos testar o operador pipe para calcular novamente a raiz quadrada da soma de um vetor.

x <- c(1:10)
x %>% sum %>% sqrt %>% round

Observe que a escrita fica muito mais intuitiva e elegante. Para o caso do bolo:

# recipiente(rep("farinha", 2), "água", "fermento", "leite", "óleo") %>%
#   acrescente("farinha", até = "macio") %>%
#   bata(duração = "3min") %>%
#   coloque(lugar = "forma", tipo = "grande", untada = T) %>%
#   asse(duração = "50min") %>%
#   esfrie("geladeira", "20min")

A utilização do pipe será muito importante para a manipulação das bases de dados, uma vez que, geralmente, são necessárias várias sequências de funções até que elas fiquem no formato desejado para análise.

Onde encontrar ajuda

Há várias maneiras de encontrar ajuda sobre um pacote específico. Por exemplo, você pode acessar os detalhes da função psych::describe posicionado o cursor próximo a função e pressionando a tecla F1.

Uma outra maneira é colocar uma interrogação \(?\) antes da função para a qual se quer ajuda e executá-la. Uma terceira opção é utilizar a função help.

?psych::describe
help("describe")
help(describe)
?psych
help("psych")
help(psych)

Para uma pesquisa mais ampla, que irá escanear todos os documentos de pacotes instalados na sua biblioteca, você pode utilizar o símbolo \(??\) antes da função ou utilizar diretamente a função help.search

??psych
help.search("psych")

Por fim, outra forma de realizar pesquisas, utilizando a internet é com a função RSiteSearch.

RSiteSearch("psych") # Pesquisar um termo

O R é um software de código aberto. Toda e qualquer função pode ser analisada. Para acessar o código de uma função, posicione o cursor sobre a função e tecle F2. Você pode acessar a função rodando somente o nome da função.

psych::describe

Algumas funções são aplicadas por diferentes métodos, como é o caso da função mean. Para consultar os métodos disponíveis, utilize a função methods.

methods(mean)
mean.default
mean.difftime

Para consultar uma função em qualquer pacote do R, utilize a função getAnywhere.

getAnywhere(describe)
getAnywhere(describe)[1]

As funções do tipo .C(), .Call(), .Fortran(), .External(), ou .Internal() e .Primitive() chamam códigos compilados, sendo necessário olhar o código fonte. Consulte o manual do R para maiores informações.

Como alternativa, você pode acessar a página do Github do pacote e verificar a função diretamente do arquivo .R. Por exemplo, as funções do pacote base estão disponíveis aqui. Para uma discussão aprofundada sobre o tema, acesse esse site.

Além disso, no RStudio, você conta com as Cheat Sheets, na barra superior de ajuda (Help). Você poderá baixar diversos pdfs com “colas” para as principais operações realizadas na análise de dados.

As versões mais recentes do RStudio contam com a aba Tutorial, na qual você poderá aprender alguns tópicos diretamente no RStudio.

O site stackoverflow é outra excelente fonte de informação. É muito possível que a dúvida ou o problema que você está encontrando em alguma programação já foi enfrentado por outro usuário. Assim, basta pesquisar sobre sua dúvida neste site (geralmente, feitas e respondidas em inglês).

Por fim, uma boa e velha máquina de buscas é fundamental. Quase todas as repostas você encontrará com sua utilização.

Carga da PDAD 2021

Vamos iniciar a atividade de manipulação de base de dados carregando a Pesquisa Distrital por Amostra de Domicílios 2021. A PDAD é uma pesquisa amostral conduzida pela Codeplan a cada dois anos, com representatividade para as 33 Regiões Administrativas2, tendo por objetivo traçar as principais características dos domicílios e pessoas destas localidades.

Vamos carregar a pesquisa de quatro maneiras diferentes. A PDAD 2021 está disponível, no formato .csv, no site da Codeplan, neste endereço. São cinco arquivos: dois deles contendo os microdados, referentes aos domicílios e aos moradores; dois arquivos de dicionário, um em formato .xlsx e outro em .pdf; e o questionário.

As bases de dados com microdados usualmente são separadas em tantos arquivos quanto necessário, seguidos sempre de uma documentação que detalha os aspectos técnicos, fornecendo informações para sua manipulação. Reserve um tempo para ler esses arquivos e se familiarizar com as questões presentes na pesquisa.

Vamos criar um projeto para fazermos nossas análises. Acesse sua conta no github e crie um novo repositório. Depois disso, vamos criar um novo projeto no RStudio server. Para isso, clique em File -> New project -> Version Control ->Git. No campo Repository URL, cole a url do projeto que você acabou de criar.

Atenção: você pode copiar o link HTTPS ou SSH do projeto na página do github. Para um tutorial de como utilizar autenticação por chave SSH no RStudio, acesse esse site.

Agora que o projeto do nosso curso foi criado, vamos carregar os arquivos da PDAD no servidor onde o RStudio está instalado. Crie uma pasta chamada dados e salve os arquivos da pesquisa dentro dela.

Como boa prática, é costume que apenas os códigos sejam carregados no Github. Para ignorar a pasta de dados, abra o arquivo .gitignore (caso que não tenha sido criado junto com o projeto, basta criar um arquivo de texto com esse nome) e adicione uma linha com a informação /dados.

É possível também fazer o download dos arquivos diretamente pelo R seguindo os passos abaixo.

# Criar um novo diretório
#dir.create("dados")

# Listar as informações da URL
library(RCurl)

# Pegar informações da URL
info <- getURL("https://www.codeplan.df.gov.br/microdados-pdad-2021/",
               verbose=TRUE,
               ftp.use.epsv=TRUE, 
               dirlistonly = TRUE)

# Separar as informações em linhas
info <- str_split(info,"\n") %>% 
  unlist

# Extrair as informações do arquivo csv de interesse
b <- info[str_detect(info,".csv")]

# Pegar a URL, extraindo a informação entre aspas
b <- str_match(b, '["](.*?)["]')[3:4]

# Criar o caminho de destino, pegando o nome do arquivo
td <- paste0("dados/",str_extract(b,'Mor(.*?).csv$')[2])

# Fazer o download do csv
download.file(b[2], td, mode="wb")

# Fazer a mesma coisa para o arquivo de domicílios
td <- paste0("dados/",str_extract(b,'Dom(.*?).csv$')[1])

download.file(b[1], td, mode="wb")

# Fazer o download do dicionário em excel
d <- info[str_detect(info,".xlsx")]

# Pegar a url
d <- str_match(d, '["](.*?)["]')[2]

# Pegar o nome do arquivo
td <- paste0("dados/",str_extract(d,'Dic(.*?).xlsx$'))

# Fazer o download
download.file(d, td, mode="wb")

# Pegar os arquivos pdf da PDAD
pdf <- info[str_detect(info,"Man(.*?).pdf|Ques(.*?).pdf")] %>%
  # Pegar a URL
  str_match('href=(.*?).pdf') %>% 
  # Tratar a URL
  str_remove('href="') %>% 
  # Ficar com as linhas de interesse
  .[1:2]

# Baixar os dois arquivos
for(i in pdf){

  # Pegar o nome do arquivo
  nome <- str_extract(i,"7(.*?)$") %>% 
    str_remove("7/")
  
  # Criar o caminho do arquivo
  td <- paste0("dados/",nome)
  
  # Fazer o download
  download.file(i, td, mode="wb")
}

Feito isso, vamos agora carregar os dados no R de diferentes métodos.

Método point-and-click

Para isso, clique em Import Dataset, no atalho do painel Ambiente. O RStudio server vem configurado com duas opções para você importar os dados. Vamos ver a primeira delas: From Text(base).

Nesta primeira opção, você seleciona o arquivo .csv salvo no passo anterior e o R já apresenta a estrutura dos dados a ser carregada. Marque a opção “yes” em Heading e desmarque a opção String as factors. Caso deseje, altere o nome do arquivo e clique em importar.

Note que, no painel console, o código necessário para carregar a base foi inserido automaticamente. Teste novamente, copiando essa linha de comando e rodando no console.

pdad_2021_moradores <- read.csv2("dados/Moradores.csv", stringsAsFactors=FALSE)

Utilize a função View() para visualizar a base de dados (inserindo o nome do objeto dentro dos parênteses), ou clique em cima do objeto no painel Environment.

O RStudio apresenta apenas 50 colunas por vez. Clique nas setas para navegar para o próximo conjunto de 50 colunas. Caso queira aumentar a quantidade de colunas a serem exibidas, utilize rstudioapi::writeRStudioPreference("data_viewer_max_columns", 1000L) (neste exemplo, o número de colunas é elevado para 1.000).

Vamos agora testar o segundo método. Novamente, clique em Import Dataset, no atalho do painel Environment, mas agora na opção From Text(readr). Agora, ao invés de informar o arquivo que você baixou, basta informar o link onde ele está hospedado. No nosso caso, é o mesmo endereço em que baixamos os dados da PDAD 2021. Vamos testar com a base de moradores.

Assim que você inserir o link para a pesquisa, clique em Update para visualizar uma prévia dos dados. Mude o delimitador dos dados para Semicolon, clique em Configure no campo Locale e altere o marcador decimal para “,” (Decimal Mark), deixando vazio o campo Grouping Mark. Aceite as configuração realizadas clicando em Configure e, finalmente, clique em Import. Repare, novamente, que o comando necessário para carregar os dados aparece no console. Desta vez, a função utilizada para ler o conjunto de dados foi read_delim. Mais uma vez, copie e rode essa linha de comando diretamente no console, para ver como carregar a base sem o auxílio do painel.

library(readr)
pdad_2021_moradores <- read_delim("https://www.codeplan.df.gov.br/wp-content/uploads/2022/07/PDAD_2021-Moradores.csv", 
    ";", escape_double = FALSE, locale = locale(decimal_mark = ",", 
        grouping_mark = ""), trim_ws = TRUE)

Você poderia carregar os dados, de ambas as maneiras, diretamente pela linha de comando, de outras formas. Um outro pacote, bastante útil e veloz para o carregamento de dados, é o data.table. Vamos treinar o carregamento dos dados pela linha de comando com ele. Para isso, vamos antes limpar o ambiente, excluindo os objetos carregados anteriormente, com a função rm().

rm(pdad_2021_moradores) # Remove apenas o objeto "pdad_2021_moradores"
rm(list=ls()) # Remove todos os objetos do ambiente

Note que você pode excluir todos os objetos do ambiente, listando-os com a função ls(). Vamos também definir o diretório padrão em que estamos trabalhando. O RStudio server, por padrão, utilizará a pasta do seu usuário no servidor. Para consultar o diretório ativo no momento, utilize a função getwd().

getwd() # Consultar diretório de trabalho ativo

Vamos alterar para a pasta dados, criada para armazenar as bases de dados.

# Alterar diretório para 'dados'
setwd("./dados")
# Visualizar diretório ativo
getwd()
# Listar arquivos
list.files()
# Retornar para o nível anterior do diretório
setwd("..")
# Consultar diretório
getwd()

Repare que existem várias maneiras de definir o diretório padrão. Caso ele seja um subdiretório do qual você já está trabalhando atualmente, basta entrar com o caractere . antes do caminho desejado. Este recurso é um atalho para o endereço do diretório atualmente ativo no R. Você também pode indicar o caminho completo. Atente-se para o fato de que o padrão dos caminhos é a barra invertida /. Apesar de este ser o padrão Linux, ele também deve ser seguido nas demais plataformas, como o Windows (você pode utilizar também duas barras seguidas nos caminhos do Windows \\). Um atalho para o diretório padrão do seu R é o caractere ~. O caractere .. indica o nível anterior do diretório.

Método por linha de comando

Agora vamos carregar novamente a base de moradores da PDAD, desta vez apenas utilizando a linha de comando.

# Carregar o pacote
library(data.table)

# Carregar a base de um link da internet.
pdad_2021_moradores <- data.table::fread("https://www.codeplan.df.gov.br/wp-content/uploads/2022/07/PDAD_2021-Moradores.csv",dec = ",",encoding = "Latin-1",
                                         data.table = FALSE,
                                         integer64 = "character")

# Carregar a base de um arquivo local
pdad_2021_moradores <- data.table::fread("dados/Moradores.csv",
                                    dec = ",",encoding = "Latin-1",
                                          data.table = FALSE,
                                         integer64 = "character")

Com a função fread() é possível carregar a base de ambas as maneiras vistas anteriormente. Note que a função fread() detectou o delimitador automaticamente. Informamos apenas que o separador decimal da nossa base é a vírgula, com a opção dec="," e que o enconding do arquivo é enconding=Latin-1. Essa última opção é importante quando estamos transitando arquivos salvos em diferentes plataformas, principalmente entre Windows e Linux, que possuem formas distintas de tratar caracteres especiais. O parâmetro data.table=FALSE carregará a tabela no formato data.frame, ao invés do padrão data.table, enquanto o parâmetro integer64 = "character" irá tratar número do tipo Bigint como character. Neste curso, aprenderemos a trabalhar data.frames e tibbles, embora exista a possibilidade de se realizar manipulações com o pacote data.table de maneira bastante eficiente. Agora que você já aprendeu a carregar a base de moradores, pratique carregando também a base de domicílios.

Carga pelo banco de dados

A última maneira, que deverá ser sempre sua primeira opção, é carregar a base diretamente do banco de dados da Codeplan. Para isso, vamos precisar do pacote RODBC, que fará a nossa conexão com o banco de dados. Isso é feito através da função odbcConnect().

O primeiro argumento desta função é o nome do banco de dados, atribuído no momento da configuração da conexão ODBC. No RServer, o nome atribuído foi db_codeplan. Este argumento deve ser fornecido entre aspas. Os próximos argumentos são o nome de usuário e senha. Você deve usar as suas credenciais, fornecidas pelo administrador do banco de dados.

# Carregar pacote
library(RODBC)
# Abrir conexão com o banco de dados
# Atenção! Não utilize a função Sys.getenv sem confirar o ambiente antes!
db <- RODBC::odbcConnect("db_codeplan", uid=Sys.getenv("matricula"), pwd=Sys.getenv("senha"))

Pronto! Já estamos conectados ao banco de dados.

IMPORTANTE: sempre que você estiver escrevendo um código, o qual irá posteriormente subir no Github, NUNCA, JAMAIS e EM HIPÓTESE ALGUMA salve seu usuário e senha no script. Isso representa uma grave quebra de segurança, podendo ter importantes repercussões. Utilize umas das três opções: i) sempre preencha manualmente seu usuário e senha; utilize arquivos .Renviron com suas credenciais; utilize o pacote keyring para o gerenciamento de credenciais. A solução acima utiliza o arquivo .Renviron, que pode ser configurada pelo RStudio com a função usethis::edit_r_environ().

Para consultar as tabelas disponíveis, utilizamos a função sqlTables(). O argumento desta função é o objeto com a conexão que fizemos para o banco de dados.

# Verificar as tabelas disponíveis no banco de dados
tabelas <- RODBC::sqlTables(db)

No objeto tabelas, podemos observar todas as tabelas que temos permissão de acesso. Para consultar as tabelas, você pode clicar no objeto carregado ou utilizar a função View(), utilizando o nome do objeto como argumento. Para consultar a classe do objeto carregado, utilize a função class(), enquanto, para ver os nomes da colunas, utilize as função names(). A função head() apresenta as primeiras linhas do data.frame, enquanto a função tails() apresenta as últimas. Os tipos das colunas podem ser consultados com a função str() ou glimpse(), do pacote dplyr. Finalmente, podemos consultar a quantidade de linhas e a quantidade de colunas carregadas com as funções nrow() e ncol(), respectivamente.

#View(tabelas) # Visualizar o objeto tabelas
class(tabelas) # Verificar a classe do objeto
names(tabelas) # Verificar o nome das colunas carregadas
head(tabelas) # Verificar as primeiras linhas da tabela
tail(tabelas) # Verificar as últimas linhas da tabela
str(tabelas) # Verificar as classes das colunas
dplyr::glimpse(tabelas) # Outra opção para checar as classes
nrow(tabelas) # Consultar o número de linhas
ncol(tabelas) # Consultar o número de colunas

A coluna TABLE_CAT informa o banco de origem, TABLE_SCHEM informa o esquema da tabela, TABLE_NAME o nome da tabela, TABLE_TYPE o tipo e REMARKS as observações, se houver alguma.

O objeto do tipo data.frame, que é o formato do objeto tabelas, será o foco da nossa aula. Esse objeto é como se fosse uma matriz, em que as linhas representam as observações e as colunas as variáveis. Como em uma matriz, você pode acessar as linhas e as colunas com o operador [,] logo após o nome do objeto. À esquerda, indica-se a posição da linha, enquanto, à direita, indica-se a coluna. Você pode utilizar a posição numérica ou o nome da coluna. Repare que a função names() indica, além dos nomes, a posição das colunas. Elas ficam entre colchetes, apresentadas em ordem crescente. Outra maneira para acessar uma variável específica é utilizando o caractere $ logo após o nome do data.frame. Por exemplo, para consultar apenas a coluna com os esquemas, utilize um dos comandos abaixo.

tabelas$TABLE_SCHEM # Consultar apenas a coluna "TABLE_SCHEM"
tabelas[,2] # Outra maneira de consultar a coluna "TABLE_SCHEM"
tabelas[,"TABLE_SCHEM"] # Mais uma maneira de consultar a coluna "TABLE_SCHEM"
tabelas[1:2,1:2] # Selecionar apenas as duas primeiras linhas e colunas
tabelas[1:2,]$TABLE_SCHEM # Selecionar apenas as duas primeiras linhas da coluna "TABLE_SCHEM"
tabelas[c(1,7,10:12),c(1,3)] # Selecionar linhar e colunas distintas

Para fazer uma tabulação simples, de modo a verificar o número de tabelas em cada esquema, utilize a função table().

table(tabelas$TABLE_SCHEM) # Tabular a coluna
table(tabelas[,2]) # Tabular a coluna
table(tabelas[,"TABLE_SCHEM"]) # Tabular a coluna

Agora vamos aprender a filtrar os dados. Como o nosso objetivo é a PDAD, focaremos apenas nas tabelas deste esquema. Em outras palavras, queremos olhar apenas as linhas do esquema “pdad”. Isso pode ser feito da seguinte maneira.

tabelas[tabelas$TABLE_SCHEM=="pdad",3]
tabelas[tabelas[,2]=='pdad',]$TABLE_NAME

Dentro da tabela, para indicar a linha a ser selecionada, informamos que queremos apenas as linhas em que a coluna TABLE_SCHEM é exatamente igual à “pdad”. Note que, como se trata de um campo caractere, devemos colocar a condição do filtro entre aspas (duplas ou simples).

Com isso, já conseguimos identificar quais são as tabelas que temos interesse em analisar. Vamos refazer todos esses passos, agora de uma maneira muito mais simples e rápida, com o pacote dplyr, utilizando os pipes.

# Carregar o pacote dplyr
library(dplyr)
# Consultar as tabelas disponíveis
RODBC::sqlTables(db) %>%
  # Filtrar apenas linhas do esquema PDAD
  dplyr::filter(TABLE_SCHEM=="pdad") %>%
  # Selecionar apenas a coluna com as tabelas
  dplyr::select(TABLE_NAME)

Com as funções filter e select, conseguimos filtrar e selecionar colunas facilmente, de uma maneira rápida e elegante. Muitas vezes precisamos alterar o nome de uma coluna, seja para tornar seu entendimento mais fácil, seja por questão de conveniência seja por necessidade. Podemos fazer isso de duas maneiras: com a função colnames(), do pacote base, ou com a função rename(), do pacote dplyr.

# Alterar o nome da coluna "TABLE_SCHEM" para Esquema
colnames(tabelas)[2] <- "Esquema"
names(tabelas)[2] <- "Esquema"
# Verificar o resultado
names(tabelas)
# Alterar o nome com o dplyr
RODBC::sqlTables(db) %>%
  # Filtrar apenas linhas do esquema PDAD
  dplyr::filter(TABLE_SCHEM=="pdad") %>%
  # Alterar os nomes das colunas
  dplyr::rename(Nome=TABLE_NAME,
                Banco=TABLE_CAT,
                Esquema=TABLE_SCHEM,
                Tipo=TABLE_TYPE,
                Observações=REMARKS)

Perceba que foi necessário o conhecimento prévio de que o nome “pdad” estava presente na coluna TABLE_SCHEM. O pacote stringr conta com uma função para identificar certos argumentos no filtro, baseado em caracteres. Vejamos a função str_detect().

# Consultar as tabelas disponíveis
RODBC::sqlTables(db) %>%
  # Filtrar apenas linhas do esquema PDAD
  dplyr::filter(stringr::str_detect(TABLE_SCHEM, pattern =  "pdad")) %>%
  # Selecionar apenas a coluna com as tabelas
  dplyr::select(TABLE_NAME)

Agora que temos o nome das tabelas da PDAD, vamos consultar quais são as colunas existentes, por exemplo, naquela referente às pessoas, do ano de 2018. Para isso, vamos utilizar a função sqlColumns, informando a tabela específica no formato [nome do esquema].[nome da tabela].

# Consultar colunas
colunas <- RODBC::sqlColumns(db,"pdad.mor2021")

Os nomes das variáveis disponíveis estarão na coluna COLUMN_NAME. O objeto carregado possui diversas informações, como o tipo e o tamanho da coluna. Como, neste momento, vamos trabalhar apenas com os nomes das colunas, vamos utilizar o que já aprendemos para visualizar somente esta informação.

# Consultar as colunas da mor2021
RODBC::sqlColumns(db,"pdad.mor2021") %>%
  # Selecionar a coluna "COLUMN_NAME"
  dplyr::select(COLUMN_NAME)

Feito isso, já estamos pronto para carregar a base de moradores da PDAD no R. Para isso, vamos utilizar a função sqlQuery. Dentro dessa função, enviamos uma consulta SQL ao banco de dados, da mesma maneira que fazemos em qualquer outro programa de acesso a BD. A única diferença é que o pacote RODBC estará intermediando a comunicação, apresentando os dados quando pertinente. Por exemplo, caso tenhamos permissão para tal, podemos criar, excluir ou alterar tabelas do banco de dados diretamente do R.

Vamos, então, carregar a base de pessoas. A estrutura para realizar uma consulta é bastante simples: dizemos a ação que queremos realizar que, no caso da consulta, é feita com a palavra select; informamos as variáveis a serem carregadas, separando-as por vírgulas; dizemos de onde queremos obter esses dados, com a palavra from; e informamos o local em que a tabela está armazenada no banco de dados, na estrutura “esquema.tabela”, no nosso caso, pdad.mor2021.

Como consultamos os nomes das tabelas anteriormente, vamos carregar somente as informações sobre a Região Administrativa e o número de moradores no domicílio, para realizarmos um pequeno exercício.

# Carregar a base de moradores da PDAD 2018
pdad_2021_moradores <- RODBC::sqlQuery(db,"select A01ra from pdad.mor2021")

ALTERNATIVA: Pacote DBI e interface de conexão pelo RStudio Server

Uma maneira alternativa de conexão ao banco de dados é com os pacotes DBI e odbc, que possuem integração com o RStudio server. Para algumas finalidades, esse tipo de conexão pode ser mais indicada. Vamos ver como fazer a conexão com esse pacote.

# Conexão ao banco de dados com o pacote DBI
db <- DBI::dbConnect(odbc::odbc(), "db_codeplan",uid=Sys.getenv("matricula"),pwd=Sys.getenv("senha"))

O primeiro argumento indica o driver necessário para estabelecer a conexão. Os demais argumentos são os mesmo utilizados para a conexão com o pacote RODBC. Assim que você fizer a conexão, o pacote já ativa a aba Connections, no painel superior direito.

Por ali, você pode consultar os bancos, esquemas e tabelas disponíveis, bem como as colunas. Para verificar uma prévia com as 1.000 primeiras linhas, basta clicar ícone da tabela desejada. Para consultar as tabelas ou colunas disponíveis (que são retornadas em formato de vetor), utilize as funções abaixo.

DBI::dbListTables(db) # Consultar tabelas
DBI::dbListFields(db,"mor2018") # Consultar colunas da tabela mor_2018

Para fazer uma consulta, utilize a função

pdad_2021_moradores <- DBI::dbGetQuery(db,"select A01ra from pdad.mor2021")

Continução

Vamos usar o que aprendemos para verificar, de maneira rápida, quantas pessoas foram entrevistadas em cada RA.

# Tabular a amostra por RA
table(pdad_2021_moradores$A01ra)

Note que os dados são apresentados com suas codificações. Precisaremos do dicionário de variáveis para entendermos a correspondências entre os códigos e as RAs. Antes de começarmos a realizar estes tratamentos, vamos carregar toda a base da PDAD. Para isso, basta utilizar o caractere * na consulta SQL no argumento das variáveis desejadas (todas, neste caso).

# Carregar a base completa de moradores
pdad_2021_moradores <- DBI::dbGetQuery(db,"select * from pdad.mor2021")

Para termos o dicionário de dados da base de moradores prontamente acessível dentro do R, vamos carregado utilizando a função readxl::read_excel().

# Listar os arquivos do diretório dados
list.files("dados")
# Carregar as informações do dicionário
dic_moradores <- readxl::read_excel("dados/Dicionario_de_variaveis_PDAD-2021.xlsx",
                                    skip = 0,
                                    sheet = 2)

Agora que temos as descrições das variáveis, disponível na coluna Descrição da coluna, vamos adicionar esses rótulos à base da pdad, com ajuda do pacote Hmisc. Esse passo, apesar de dispensável, pode nos ajudar no entendimento do significado das variáveis de maneira rápida, evitando consultas ao dicionário.

# Carregar o pacote
library(Hmisc)
# Criar um objeto com os rótulos
var.labels <- dic_moradores$`Descrição da coluna` %>%
  # Retirar as linhas ausentes
  na.omit
# Nomear esses rótulos com o nome das variáveis do nosso banco de dados  
names(var.labels) <- names(pdad_2021_moradores)
# Adicionar os rótulos ao nosso banco de dados
pdad_2021_moradores <- Hmisc::upData(pdad_2021_moradores, labels = var.labels)
# Verificar o resultado
Hmisc::describe(pdad_2021_moradores)

Vamos agora ver como criar uma nova variável, no formato fator, atribuindo label (rótulo) aos valores. Faremos isso com as Regiões Administrativas de residência dos respondentes. Isso pode ser feito, dentro do pacote dplyr, com as funções mutate ou transmute. A primeira cria uma nova variável no banco de dados, mantendo todas as demais, enquanto a segunda mantém somente as variáveis que estão sendo criadas dentro da função.

# Construir uma variável em formato de fator
RA <- pdad_2021_moradores %>%
  dplyr::transmute(RA=factor(A01ra,
                            levels=1:33,
                            labels=c('Plano Piloto',      
                                     'Gama',
                                     'Taguatinga',
                                     'Brazlândia',
                                     'Sobradinho',
                                     'Planaltina',
                                     'Paranoá',
                                     'Núcleo Bandeirante',
                                     'Ceilândia',
                                     'Guará',
                                     'Cruzeiro',
                                     'Samambaia',
                                     'Santa Maria',
                                     'São Sebastião',
                                     'Recanto das Emas',
                                     'Lago Sul',
                                     'Riacho Fundo',
                                     'Lago Norte',
                                     'Candangolândia',
                                     'Águas Claras',
                                     'Riacho Fundo II',
                                     'Sudoeste/Octogonal',
                                     'Varjão',
                                     'Park Way',
                                     'SCIA-Estrutural',
                                     'Sobradinho II',
                                     'Jardim Botânico',
                                     'Itapoã',
                                     'SIA',
                                     'Vicente Pires',
                                     'Fercal',
                                     'Sol Nascente/Pôr do Sol',
                                     'Arniqueira')))
# Tabular os resultados
table(RA$RA)

A função fator possui três argumentos principais: o vetor a ser “fatorizado”, os níveis existentes, i.e., o conjunto de valores únicos existente no vetor, e os rótulos que cada um dos níveis deve receber. Poderíamos ter feito isso utilizando diretamente o dicionário de variáveis, ajustando as informações pelo R.

# Filtrar somente as informações da coluna RA

dic_ra <- readxl::read_excel("dados/Dicionario_de_variaveis_PDAD-2021.xlsx",
                                    skip = 0,
                                    sheet = 3)

# Recodificar os nomes
ra_codificada <- pdad_2021_moradores %>%
  dplyr::transmute(ra=factor(A01ra,
                             levels = dic_ra$Valor,
                             labels = dic_ra$`Descrição do valor`))

# Tabular os resultados
table(ra_codificada$ra)

Apesar de parecer mais complexo, isso evita que tenhamos de copiar, colar ou escrever manualmente o nome de todas as 33 Regiões Administrativas. Se o número de categorias fosse mais elevado, certamente esses passos seriam fundamentais para dar agilidade à tarefa a ser realizada.

Agora que já conseguimos identificar qual foi a amostra em cada uma das RAs, vamos fazer uma gráfico simples, para verificarmos onde obtivemos as maiores amostras. Para isso, vamos usar a o pacote ggplot.

O ggplot trabalha com data.frames, e não somente com vetores individuais, como é o caso da função plot, disponível no pacote graphics do R. Uma vantagem do ggplot é que você pode adicionar camadas a um gráfico existente de maneira simples e rápida, com o operador +. A função aes() é utilizada para especificar quais serão os eixos do gráfico, usualmente x e y, bem como o que deverá ser desenhado no gráfico. Para um tutorial mais completo, acesse esse site.

RA %>%
  # Criar a área de plotagem, com o eixo X
  ggplot(aes(x=RA)) +
  # Inserir a geometria do tipo "Barra", com a opção de contagem (gerada automaticamente no eixo y)
  geom_bar(stat = "count") +
  # Inverter os eixos
  coord_flip()

Agora vamos organizar essas informações de uma outra maneira, resumindo o total da amostra por Região Administrativa, refazendo o gráfico, para colocá-lo em ordem decrescente de localidade amostrada. Para isso, vamos utilizar o pacote forcats.

# Contar quantas pessoas foram amostradas em cada RA
RA %>%
  # Contar quantas observações temos em cada RA
  dplyr::count(RA) %>%
  # Plotar o gráfico, ajustando as categorias de acordo com o total amostrado
  ggplot(aes(x=forcats::fct_reorder(RA,n),y=n)) +
  # Desenhar a geometria de barras
  geom_bar(stat = "identity") +
  # Inverter os eixos
  coord_flip() +
  # Rotular os eixos
  labs(y="Amostra",
       x="Região Administrativa")

Agora, a apresentação da informação ficou um pouco mais clara. Com o pacote ggplot, é possível alterar praticamente todos os aspectos de um gráfico. Existem alguns pacotes que carregam temas pré-configurados para serem utilizados com o ggplot. Vamos testar o pacote ggthemr. Basta rodar a função de mesmo nome e todos os gráficos subsequentes serão gerados com o novo tema.

ggthemr::ggthemr()

#ggthemr::ggthemr_reset()

Rode novamente o gráfico anterior e veja o resultado.

Posteriormente, vamos aprender a realizar outras configurações nos gráficos gerados com o ggplot.

Agora que já aprendemos a carregar e manipular as bases de dados, tente carregar a base de domicílios, diretamente do banco de dados.

# Carregar as informações do dicionário
dic_domiclios <- readxl::read_excel("dados/Dicionario_de_variaveis_PDAD-2021.xlsx",
                                    skip = 0, sheet = 1)

# Criar um objeto com os rótulos
var.labels <- dic_domiclios$`Descrição da coluna` %>%
  na.omit
# Nomear esses rótulos com o nome das variáveis do nosso banco de dados  
names(var.labels) <- names(pdad_2021_domicilios)
# Adicionar os rótulos ao nosso banco de dados
pdad_2021_domicilios <- Hmisc::upData(pdad_2021_domicilios, labels = var.labels)
# Verificar o resultado
Hmisc::describe(pdad_2021_domicilios)

Aprofundando o tratamento de strings

Manipular string pode ser muito importante em uma pesquisa. Vamos ver como podemos detectar algumas expressões com o pacote stringr.

Abaixo você encontra alguns exemplos de operadores ao utilizar strings:

  • ‘can’: reconhece tudo que tenha “can”, ignorando maiúsculas
  • ‘CAN’: reconhece tudo que tenha “CAN”, ignorando minúsculas
  • ‘can$’: reconhece apenas o que termina exatamente em “can”
  • ‘^can’: reconhece apenas o que começa exatamente com “can”
  • ‘c ?an’: reconhece tudo que tenha “can”, com ou sem espaço entre o “c” e o “a”

Veja como funcionam os testes lógicos.

Teste lógicos de strings
strings ^can c ?an can CAN can$
bacana FALSE TRUE TRUE FALSE FALSE
can TRUE TRUE TRUE FALSE TRUE
CANA FALSE FALSE FALSE TRUE FALSE
encanado FALSE TRUE TRUE FALSE FALSE
encanta FALSE TRUE TRUE FALSE FALSE
levou o cano FALSE TRUE TRUE FALSE FALSE

Para se verificar quantas vezes um caractere se repete, dado um determinado padrão, utilizamos os símbolos +, * e {x,y}.

  • ey+ significa e e depois yuma vez ou mais”. Por exemplo, reconhece hey, heyy, a eyyy, mas não reconhece e, y nem yy.
  • ey* significa “nenhuma vez ou mais”. Por exemplo, reconhece hey, heyy, a eyyy e e, mas não reconhece y nem yy.
  • ey{3} significa “exatamente três vezes”. Por exemplo, reconhece eyyy e eyyyy, mas não reconhece eyy.
  • ey{1,3} significa “entre uma e três vezes”.

Para aplicar um quantificador a um conjunto de caracteres, usamos os parênteses. Por exemplo, (ey )+ reconhece ey ey.

Colocando caracteres dentro de [], reconhecemos quaisquer caracteres desse conjunto. Por exemplo:

  • [Cc]urso para reconhecer “curso” em maiúsculo ou minúsculo.
  • [0-9] para reconhecer somente números. Para letras: [a-z], [A-Z], [a-zA-Z]
  • O símbolo ^ dentro do colchete indica negação. Por exemplo, [^0-9] significa todos os caracteres, exceto números.
  • O símbolo . fora do colchete indica “qualquer caractere”. Dentro do colchete é apenas um caractere
  • Com [[:space:]] reconhecemos espaços, com [[:blank:]] reconhecemos espaços em branco e tabulações, com [[:lower:]] reconhecemos minúsculas, com [[:upper:]] reconhecemos minúsculas e com [[:punct:]]+ reconhecemos pontuações.

Trabalhando com datas

Vez ou outra nos deparamos com bases de dados que contêm variáveis do tipo data. Dentro da família tidyverse, temos o pacote lubridate, que facilita muito a manipulação deste tipo de dado. Na PDAD 2021, temos a variável endtime, que traz o dia em que as informações foram coletadas no domicílio. Vamos utilizar essa variável para manipular datas.

Vamos verificar como estão preenchidas as primeiras linhas dessa coluna, com auxílio da função head().

# Verificar as primeiras informações da coluna endtime
head(pdad_2021_domicilios$endtime)

Repare a data está no formato “YYYY/MM/DD”.

Vamos analisar agora qual a classe dessa coluna.

# Verificar a classe da coluna endtime
class(pdad_2021_domicilios$endtime)

Vemos que ela é uma coluna rotulada da classe “integer” (e também “labelled”, devido à utilização do pacote Hmisc). Precisamos alterar o formato dela para fazermos cálculos de tempo. Faremos isso e calcularemos a quantidade de domicílios coletados em cada mês.

# Carregar pacote lubridate
library(lubridate)

# Utilizar a base de domicílios
pdad_2021_domicilios %>%
  # Selecionar a data da pesquisa
  dplyr::select(endtime) %>%
  # Transformar o campo de data (em caracter) em data (formato data)
  dplyr::mutate(endtime=lubridate::ymd(endtime),
                # Extrair o valor do mês
                MES=lubridate::month(endtime,label=T)) %>%
  # Agrupar por mÊs e contar a quantidade de casos por mÊs
  dplyr::count(MES) 

Assim, temos a informação de que a coleta teve início em maio e foi finalizada em dezembro Também verificamos que o mês com a maior quantidade de domicílios coletados foi outubro. Vamos verificar essas informações por Região Administrativa.

Antes, vamos criar uma variável RA com os labels das RAs, de modo a facilitar a visualização.

# Criar uma variável com o nome das RAs na base de domicílios
pdad_2021_domicilios <- pdad_2021_domicilios %>%
  dplyr::mutate(RA=factor(A01ra,
                            levels=1:33,
                            labels=c('Plano Piloto',      
                                     'Gama',
                                     'Taguatinga',
                                     'Brazlândia',
                                     'Sobradinho',
                                     'Planaltina',
                                     'Paranoá',
                                     'Núcleo Bandeirante',
                                     'Ceilândia',
                                     'Guará',
                                     'Cruzeiro',
                                     'Samambaia',
                                     'Santa Maria',
                                     'São Sebastião',
                                     'Recanto das Emas',
                                     'Lago Sul',
                                     'Riacho Fundo',
                                     'Lago Norte',
                                     'Candangolândia',
                                     'Águas Claras',
                                     'Riacho Fundo II',
                                     'Sudoeste/Octogonal',
                                     'Varjão',
                                     'Park Way',
                                     'SCIA-Estrutural',
                                     'Sobradinho II',
                                     'Jardim Botânico',
                                     'Itapoã',
                                     'SIA',
                                     'Vicente Pires',
                                     'Fercal',
                                     'Sol Nascente/Pôr do Sol',
                                     'Arniqueira')))
coleta <-
# Utilizar a base de domicílios
pdad_2021_domicilios %>%
  # Selecionar a data da pesquisa
  dplyr::select(RA,endtime) %>%
 # Transformar o campo de data (em caracter) em data (formato data)
  dplyr::mutate(endtime=lubridate::ymd(endtime),
                # Extrair o valor do mês
                MES=lubridate::month(endtime,label=T)) %>%
  # Agrupar e contar por RA e por  Mês
  dplyr::count(RA,MES)

# Visualizar resultado
#View(coleta)

Gravar uma tabela no formato “.csv”

Agora que geramos a tabela com as informações de coleta, vamos salvar os resultados em um arquivo .csv. Para isso, vamos utilizar a função write.table(), do pacote utils. Com a função, informe o objeto que você quer utilizar para gerar o arquivo no primeiro argumento e o nome do arquivo a ser gerado no segundo argumento. O arquivo será salvo no seu diretório de trabalho, por padrão. Caso você queria salvá-lo em outro local, basta informar o caminho desejado antes do nome do arquivo (e.g. dados/, para salvar em um subdiretório chamado dados).

Assim como as colunas possuem nomes, as linhas também podem ser nomeadas no R. Quando não damos um nome específico para as linhas, elas são, por padrão, nomeadas com números inteiros sequenciais, de 1 até o número de linhas da tabela. Consulte essa informação com a função row.names().

Como não queremos que essas informações apareçam na nossa tabela, utilizamos o argumento row.names = F no momento de escrevermos a tabela. Além disso, o arquivo será gerado, por padrão, delimitado por espaços. Vamos alterar o delimitador para ponto e vírgula ;. Poderíamos escolher qualquer outro delimitador desejado. Por fim, caso necessário, você também pode informar o encoding desejado para salvar o arquivo, com o parâmtero fileEncoding. Se o seu objeto tiver algum valor ausente, você pode alterar o formato que ele será gravado com o parâmetro na. Por exemplo, para que os valores ausentes sejam gravados sem informação, utilize na="". Caso você queira que as colunas com string sejam gravadas entre aspas, utilize o parâmetro quote=TRUE.

write.table(coleta,"dados/coleta.csv",
            row.names = F, sep = ";",
            fileEncoding = "latin1")

Vamos verificar o resultado localmente. Procure no diretório o arquivo que acabou de ser criado e abra-o. Assim, você pode compartilhar esse resultado com outros pesquisadores em um formato legível em outros softwares, como o Microsoft Excel.

Para gravar diretamente em um arquivo do tipo .xlsx, podemos utilizar a função xlsx::write.xlsx. Vejamos um exemplo abaixo.

# Carregar o pacote
library(xlsx)

# Salvar as informações
xlsx::write.xlsx(coleta,
                 file = "dados/coleta.xlsx",
                 sheetName = "Coleta",
                 row.names = F)

Atualmente, o pacote grava apenas objetos do tipo data.frame. Lembre-se de converter o objeto do tipo tibble para data.frame antes de salvar, caso você esteja trabalhando com este tipo de informação.

Operações com datas

Vamos agora aprender a fazer operações com datas. Vamos calcular o intervalo existente entre a data de referência da pesquisa e a data da coleta.

# Criar um objeto com a data de referência da pesquisa
ref <- lubridate::dmy("01-07-2021")

# Armazenar o resultado em um objeto
referencias <- 
# Utilizar a base de domicílios
pdad_2021_domicilios %>%
  # Selecionar a data da pesquisa
  dplyr::select(endtime) %>%
  # Transformar o campo de data (em caracter) em data (formato data)
  dplyr::mutate(endtime=lubridate::ymd(endtime),
                # Calcular a diferença entre as datas, em meses
                dif_data_mes=interval(ref,endtime) %/% months(1),
                # Calcular a diferença entre as datas, em dias
                dif_data_dia=interval(ref,endtime) %/% days(1))

Vamos aproveitar para fazer um gráfico de densidade com essa informação.

# Utilizar o objeto de referências
referencias %>%
  # Criar um plot com a diferença de dias no eixo x
  ggplot(aes(x=dif_data_dia)) +
  # Fazer o gráfico de densidade
  geom_density() +
  # Adicionar uma linha vermelha vertical no ponto zero
  geom_vline(aes(xintercept= 0), color="red")+
  # Nomear os eixos
  labs(y="Densidade",
       x="Diferença de dias da pesquisa")

Assim, percebemos que houve um pico de coletas após a data de referência da pesquisa, que coincide com o mês de Outubro.

Criando mapas

Com o R, é possível fazermos mapas com relativa facilidade. Para tanto, precisaremos de informações geográficas dos mapas que queremos desenhar. Vamos fazer conexão com o banco de dados do núcleo de geografia e pegar as informações necessárias.

library(RPostgreSQL)
library(postGIStools)
library(ggrepel)
library(sf)
library(rgdal)

# Fazer a conexão no banco do NUGEO
db_geo <- DBI::dbConnect(PostgreSQL(),dbname = "nucleo_geo", 
                      user = Sys.getenv("user_geo"),
                      host=Sys.getenv("host_geo"),
                      password = Sys.getenv("senha_geo"))

# Puxar as informações de geometria
RA <- postGIStools::get_postgis_query(db_geo, "SELECT * FROM nivel_territorial.tb_ra_proposta_seduh_2019",
                        geom_name = "geom")

# Transformar em objeto do tipo sf
RA <- sf::st_as_sf(RA) 

# Calcular os totais populacionais
pdad_mor<- DBI::dbGetQuery(db,"select A01ra, PESO_MOR from pdad.mor2021") %>%
  # Agrupar por RA
  dplyr::group_by(A01ra) %>%
  # Somar os fatores
  dplyr::summarise(n=sum(PESO_MOR)) 

# Fazer o mapa
map <- RA %>%
  # Fazer um join das informações populacionais
  dplyr::left_join(pdad_mor,by=c("ra_num"="A01ra")) %>%
  # Calcular o centro das coordenadas (para o label)
  dplyr::mutate(lat=sf::st_coordinates(sf::st_centroid(geometry))[,2],
                long=sf::st_coordinates(sf::st_centroid(geometry))[,1]) %>% 
  # Ajustar as RAs
  dplyr::mutate(nome2=factor(ra_num,
                            levels=sort(RA$ra_num),
                            labels=c('Plano Piloto',      
                                     'Gama',
                                     'Taguatinga',
                                     'Brazlândia',
                                     'Sobradinho',
                                     'Planaltina',
                                     'Paranoá',
                                     'Núcleo Bandeirante',
                                     'Ceilândia',
                                     'Guará',
                                     'Cruzeiro',
                                     'Samambaia',
                                     'Santa Maria',
                                     'São Sebastião',
                                     'Recanto das Emas',
                                     'Lago Sul',
                                     'Riacho Fundo',
                                     'Lago Norte',
                                     'Candangolândia',
                                     'Águas Claras',
                                     'Riacho Fundo II',
                                     'Sudoeste/Octogonal',
                                     'Varjão',
                                     'Park Way',
                                     'SCIA-Estrutural',
                                     'Sobradinho II',
                                     'Jardim Botânico',
                                     'Itapoã',
                                     'SIA',
                                     'Vicente Pires',
                                     'Fercal',
                                     'Sol Nascente/Pôr do Sol',
                                     'Arniqueira'))) %>%
  # Plotar o mapa
  ggplot()+
  # Fazer um mapa coroplético com a população
  geom_sf(aes(fill = n)) +
  # Mudar a escala de cores
  scale_fill_distiller(palette="Blues",
                       name="População",
                       labels= scales::unit_format(unit = "Mil", scale = 1e-3),
                       direction = 1) +
  # Tirar o sistema cartesiano
  theme(panel.grid = element_line(colour = "transparent"),
        panel.background = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        legend.title = element_text(size = 14),
        legend.text = element_text(size = 12)) +
  # Adicionar os labels
  geom_label_repel(aes(long,lat,label = nome2),
                   size=5, fontface="bold", family="Arial",
                   label.padding=unit(0.10,"line")) +
  # Retirar o label dos eixos
  labs(x="",y="") 

# Salvar o mapa criado 
ggsave(map,filename = "figuras/mapa_pop.png",
       bg = "transparent",
       width = 30, 
       height = 18, 
       units = "cm")

Para criar mapas que não estão no banco do NUGEO, utilize os passos abaixo.

library(ggrepel)
library(sf)


# tf<- "https://www.geoportal.seduh.df.gov.br/static/shapes_download/Regi%C3%B5es%20Administrativas.zip"

# Link para o arquivo shape
tf <- "http://catalogo.codeplan.df.gov.br/geoserver/wfs?format_options=charset%3AUTF-8&typename=geonode%3Aras_pdad_2013&outputFormat=SHAPE-ZIP&version=1.0.0&service=WFS&request=GetFeature"

# Caminho para salvar o arquivo
td <- "dados/shape31.zip"

# Fazer o download do arquivo
download.file(tf, td, mode="wb")

# Descompactar o arquivo
unzip(td,exdir="dados")

# Listar os arquivos da pasta dados
list.files('dados',pattern=".shp")

# Carregar o arquivo .shp
mapa <- sf::st_read("dados/ras_pdad_2013.shp") 

# Calcular o total de moradores por RA
mor <- pdad_2018_moradores %>%
  dplyr::group_by(A01ra) %>%
  dplyr::summarise(n=sum(FATOR_PROJ)) %>% 
  dplyr::mutate(A01ra=as.numeric(A01ra))

# Criar um objeto com os centros dos polígonos
pontos <- mapa %>% 
  sf::st_centroid() %>%
  dplyr::mutate(lat=sf::st_coordinates(.)[,1],
                long=sf::st_coordinates(.)[,2]) %>% 
  dplyr::select(ra_num,lat,long) %>% 
  sf::st_set_geometry(NULL) 
  
# Fazer o mapa
map <-  mapa %>%
  dplyr::left_join(mor,by=c("ra_num"="A01ra")) %>%
  dplyr::left_join(pontos) %>%
  dplyr::mutate(nome2=factor(ra_num,
                            levels=sort(mapa$ra_num),
                            labels=c('Plano Piloto',      
                                     'Gama',
                                     'Taguatinga',
                                     'Brazlândia',
                                     'Sobradinho',
                                     'Planaltina',
                                     'Paranoá',
                                     'Núcleo Bandeirante',
                                     'Ceilândia',
                                     'Guará',
                                     'Cruzeiro',
                                     'Samambaia',
                                     'Santa Maria',
                                     'São Sebastião',
                                     'Recanto das Emas',
                                     'Lago Sul',
                                     'Riacho Fundo',
                                     'Lago Norte',
                                     'Candangolândia',
                                     'Águas Claras',
                                     'Riacho Fundo II',
                                     'Sudoeste/Octogonal',
                                     'Varjão',
                                     'Park Way',
                                     'SCIA-Estrutural',
                                     'Sobradinho II',
                                     'Jardim Botânico',
                                     'Itapoã',
                                     'SIA',
                                     'Vicente Pires',
                                     'Fercal'))) %>%
  ggplot()+
  geom_sf(aes(fill = n)) +
  # Mudar a escala de cores
  scale_fill_distiller(palette="Blues",
                       name="População",
                       labels= scales::unit_format(unit = "Mil", scale = 1e-3),
                       direction = 1) +
  # Retirar o sistema cartesiano
  theme(panel.grid = element_line(colour = "transparent"),
        panel.background = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        legend.title = element_text(size = 14),
        legend.text = element_text(size = 12)) +
  geom_label_repel(aes(lat, long, label = nome2),size=3, fontface="bold", family="Arial",
                   label.padding=unit(0.10,"line")) +
  labs(x="",y="") 

# ggsave(map,filename = "figuras/mapa_pop.png",
#        bg = "transparent",
#        width = 30, 
#        height = 18, 
#        units = "cm")

Atualização de valores monetários

Recorrentemente, precisamos atualizar valores monetários. Para isso, vamos utilizar o pacote sidrar para coletar os dados de inflação do Sistema IBGE de Recuperação Automática - SIDRA. Para fazer isso, vamos montar a tabela desejada no Sidra para os dados do IPCA, disponível nesse link. Após selecionar os valores, clique no ícone para compartilhar a tabela e copie o link da api, a partir do valor /t.

Após baixar os dados, vamos manipular os dados para criar inflatores para a a atualização dos valores monetários.

# Carregar pacote sidrar
library(sidrar)
# Carregar a inflação mensal do DF em um objeto
inflacao <- sidrar::get_sidra(api = '/t/7060/n6/5300108/v/63/p/all/c315/7169/d/v63%202')
# Guardar os inflatores em um objeto
inflacao_df <- inflacao %>%
  # Filtrar para o mês de início da PDAD
  dplyr::filter(`Mês (Código)`>=202105&`Mês (Código)`<=202112) %>%
  # Organizar dados em ordem cronológica decrescente
  dplyr::arrange(desc(`Mês (Código)`)) %>%
  # Calular o inflator, acumulando os índices mensais
  dplyr::mutate(inflator=cumprod(Valor/100+1)) %>%
  # Selecionar a referência e o inflator calculado
  dplyr::select(`Mês (Código)`,inflator) %>%
  # Criar uma variável para o mes e para o ano do inflator,
  # necessária para cruzar com as informações da PDAD,
  # mantendo a variável de inflator no objeto
  dplyr::transmute(mes=as.numeric(substr(`Mês (Código)`,5,6)),
                   ano=as.numeric(substr(`Mês (Código)`,1,4)),
                   inflator=inflator)

Agora, temos um inflator para atualizar os valores monetários da PDAD 2021 para o de dezembro de 2021. Iremos utilizar essa informação mais tarde, para construirmos a renda em valores atualizados.

Vamos aproveitar a base do IPCA para aprendermos uma manipulação muito importante de bases de dados. Para fazer gráficos, o formato long é muito útil, enquanto o formato wide apresenta a tabela no formato de colunas. Vamos treinar estes conceitos carregando a inflação, de 2020 até a data mais atual, do DF, do Brasil, de São Paulo e do Rio de Janeiro.

# Carregar informações da inflação para as localidades desejadas
inflacao <- sidrar::get_sidra(api = '/t/7060/n1/all/n7/3301,3501/n6/5300108/v/63/p/all/c315/7169/d/v63%202')

# Gravar a inflação transformada em um objeto  
inflacao_wide <- inflacao %>%
  # Selecionar as variáveis de interesse
  dplyr::select(`Mês (Código)`,`Brasil, Região Metropolitana e Município`,Valor) %>%
  # Renomear as variáveis selecionadas anteriormente
  dplyr::rename_all(list(~c("referencia","Local","Valor"))) %>%
  # Mudar dados para o formato wide.
  tidyr::spread(Local,Valor)

Esse formato, em que temos cada coluna um caso, é o chamado formato wide, cuja função spread “espalha” os dados no banco. Vamos, agora, voltar os dados para o formato long, em que cada linha é um caso.

# Criar um objeto com os dados no formato long
inflacao_long <- inflacao_wide %>%
  # Passar as colunas de cada localidade para o formato long, criando
  # as variáveis "Local" e "Valor" para receberem os dados de inflação
  tidyr::gather("Local","Valor",-1)

A função gather() “junta” os valores para colocar cada caso em uma linha. Vamos agora fazer um gráfico de linhas com essas informações, plotando a inflação mensal de 2019 para essas localidades.

inflacao_long %>%
  # Ajustar a variável de referência para o formato data,
  # utilizando as informações de mês e ano, acrescentando
  # o dia primeiro, apenas como referência
  dplyr::mutate(referencia=lubridate::dmy(paste("01",
                                                stringr::str_sub(referencia,5,6),
                                                stringr::str_sub(referencia,1,4)))) %>%
  # Filtrar para o último ano (de maio a maio)
  dplyr::filter(referencia>=lubridate::dmy("01-12-2018")) %>%
  # Plotar o gráfico, com a referência no eixo x,
  # a inflação no eixo y e a localidade colorindo as linhas
  ggplot(aes(x=referencia,y=Valor,colour=Local))+
  # Construir as linhas, variando o tipo de linha conforme o local
  geom_line(aes(linetype = Local))+
  # Adicionar os pontos
  geom_point()+
  # Ajustar os rótulos dos meses do eixo x, apresentando-os
  # a cada dois meses
  scale_x_date(date_breaks = "2 month")+
  # Ajustar a legenda das cores, atribuindo cores específicas para as linhas
  scale_colour_manual(labels=c("Brasil","Distrito Federal",
                               "Rio de Janeiro","São Paulo"),
                      values=c("cadetblue4","coral4",
                               "darkgoldenrod","chartreuse4"))+
  # Ajustar a legenda das linhas, combinando com a legenda anterior
  scale_linetype_manual(labels=c("Brasil","Distrito Federal",
                                 "Rio de Janeiro","São Paulo"),
                        values=c(1:4))+
  # Ajustar o rótulo dos eixos
  labs(y="Inflação mensal",
       x="Período")+
  # Alterar a posição da legenda
  theme(legend.position = "bottom")

Criação da variável “renda domiciliar per capita”

Uma variável bastante utilizada nas análises é a renda domiciliar. Vamos construir essa variável, utilizando a seguinte metodologia: toda vez que um morador se recusar ou não souber informar algum rendimento, ele será desconsiderado do cálculo e a renda de todo o domicílio ficará com valor ausente. Além disso, vamos retirar do cômputo os empregados domésticos moradores do domicílio e seus parentes, além dos pensionistas.

# Armazenar informação em um objeto
renda_domiciliar <- pdad_2021_moradores %>%
  # Vamos mudar para ausente os valores das variáveis I04_1_1,I04_2_1,I20,I21,I22_1,I22_2
  # com códigos 77777 ou 88888.
  # Vamos também mudar para 0 quando os valores que não se aplicarem
  # ou não forem observados rendimentos
  dplyr::mutate_at(vars(I04_1_1,I04_2_1,I20,I21,I22_1,I22_2), # Variáveis a serem alteradas
                   # Função a ser aplicada
                   list(M=~case_when(. %in% c(77777,88888)~NA_real_,
                                     . %in% c(66666,99999)~0,
                                     TRUE~as.numeric(.)))) %>%
  # Selecionar apenas as variáveis de interesse
  dplyr::select(A01nficha,E05,I04_1_1,I04_2_1,I20,I21,I22_1,I22_2,
                I04_1_1_M:I22_2_M) %>%
  # Somar as variáveis modificadas para construir a renda individual
  dplyr::mutate(renda_individual=rowSums(.[,c("I04_1_1_M","I04_2_1_M",
                                              "I20_M","I21_M",
                                              "I22_1_M","I22_2_M")],na.rm = F)) %>%
  # Desconsiderar os empregados domesticos moradores e seus parentes
  dplyr::filter(!E05 %in% c(17,18,19)) %>%
  # Agrupar por domicílio
  dplyr::group_by(A01nficha) %>%
  # Somar os valores por domicílios
  dplyr::summarise(renda_dom=sum(renda_individual, na.rm = F),
                   # Construir o número de pessoas no domicílio, por esse critério de rendiment0
                   pessoas=n(),
                   # Calcular a renda domiciliar per capita
                   renda_dom_pc=renda_dom/pessoas)

No código acima, o aspecto mais importante é a opção na.rm=F, na qual informamos que os valores ausentes NÃO devem ser desconsiderados no cálculo. Verifique o valor amostral médio para a renda criada com a função mean, agora considerando apenas os casos válidos.

mean(renda_domiciliar$renda_dom, na.rm=T)

O valor amostral é de R$ 8.636 (ainda não considera a expansão, que será vista no próxima seção).

Manipulação da PDAD 2021 com expansão dos resultados

Conforme dito anteriormente, a PDAD 2021 é uma pesquisa amostral, desenhada para fornecer a caracterização socioeconômica e demográfica das 33 Regiões Administrativas, sendo ainda mais específicas para algumas delas (como Planaltina, Jardim Botânico, São Sebastião, SCIA, Vicente Pires e Taguatinga), totalizando 42 localidades. Assim, são passos necessários para essa tarefa: definir os limites territoriais; definir a área de interesse dentro desses territórios; ter uma listagem dos domicílios existentes nessas localidades (obtida, por exemplo, a partir dos cadastros da CEB, CAESB, listagens próprias ou CNEFE).

A delimitação das Regiões Administrativas considerada pela PDAD 2021 pode ser observada na imagem abaixo:

E a área de cobertura considera foi a seguinte:

A área acima corresponde às áreas urbanas e às áreas rurais com características urbanas, abrangendo a moradia de mais de 97% da população do DF.

Dentro da área de cobertura, foram selecionados mais de 35 mil domicílios. A imagem abaixo ilustra o conceito de amostragem aplicado à PDAD (imagem extraída do site mathcaptain.com).

Sendo assim, as estimativas fornecidas pela pesquisa estão sujeitas a um erro amostral, o que torna necessária a consideração de seu desenho amostral para seu cálculo. É com essas informações que construímos intervalos de confiança para as estimativas. De maneira simples, queremos fornecer, com algum grau de confiança, qual o verdadeiro valor populacional dada a amostra coletada.

A população considerada para a PDAD 2021 parte das estimativas populacionais para o DF, publicadas pelo Instituto Brasileiro de Geografia e Estatística (IBGE), em setembro de 2018. Essa população foi alocada nas RAs pela equipe da Dipos/Codeplan e ajustada para a área de alcance da PDAD 2021 pela Dieps/Gereps. A diferença entre as projeções populacionais, disponíveis neste link, e os resultados da PDAD se devem às diferenças entre a área de alcance da PDAD, a população de interesse e as delimitações consideradas para as projeções.3

Neste curso iremos aprender a declarar o plano amostral da PDAD 2021 no R, utilizando o pacote survey. Vamos utilizar também o pacote srvyr, que roda o pacote survey sob a lógica do pacote dplyr, para calcular as estimativas.

Declarar o plano amostral da PDAD 2021

Antes de declararmos o plano amostral da PDAD 2021, vamos trabalhar com a união das bases de moradores e domicílios. Muitas vezes precisamos cruzar as características de moradia com as pessoais. Por exemplo, se quisermos saber os anos de estudo médio dos responsáveis por domicílios sem esgotamento sanitário adequado, precisamos utilizar as duas bases de dados simultaneamente.

Para realizar este trabalho, vamos utilizar a função left_join() do pacote dplyr. A junção de bases pode ser feita sob várias perspectivas. Veja a figura abaixo (extraída desse site).

Conforme apresentado no diagrama de Venn, temos junções à esquerda, à direita, intersecções e complementares de conjuntos. De maneira simples, a nossa intenção é relacionar conjuntos baseado em uma característica comum entre eles – a chave (ou chaves) de ligação. No caso da PDAD, o código que identifica cada domicílio é dado pela coluna A01nficha. Essa é uma chave única na base de domicílios, sendo repetida conforme o número de moradores na base de pessoas.

# Consultar o índice das colunas de mesmo nome entre as bases
x <-
which((names(pdad_2021_domicilios) %in% names(pdad_2021_moradores)))

# Verificar quais são as colunas
names(pdad_2021_domicilios)[x]

# Fazer o join das bases
pdad <- pdad_2021_moradores %>%
  # Entrar com a função para left join
  dplyr::left_join(
    # Informar a base que iremos unir, filtrando para colunas repetidas
    pdad_2021_domicilios %>%
      dplyr::select(-c(A01ra,A01setor)))

Consulte o número de linhas e colunas da base criada. Repare que o número de linhas permaneceu o mesmo da base posicionada à esquerda, i.e., base de moradores. Como não havia nenhuma repetição na base de domicílios, o resultado já era esperado. Experimente rodar o código novamente, agora substituindo a função left_join por right_join e perceba que o resultado é exatamente o mesmo. Esse é um cuidado que se deve ter quando o desejo é ligar duas bases. Caso as chaves de ligação tivessem múltiplos casos, a função iria realizar as combinações pertinentes, o que, geralmente, causa um grande aumento no tamanho da base. Dependendo da situação, tal operação pode travar sua sessão no RStudio server (além de travar o servidor como um todo) ou, em um banco de dados, igualmente travá-lo.

Note que a função retornou um aviso no console, com a seguinte mensagem: Joining, by = "A01nFicha". Por padrão, a função de left_join() usa como argumento as colunas de mesmo nome. Caso as chaves de ligação tenham nomes distintos em cada base, podemos informar na função da seguinte maneira.

# Fazer o join das bases
pdad <- pdad_2021_moradores %>%
  # Entrar com a função para left join
  dplyr::left_join(
    # Informar a base que iremos unir, filtrando para colunas repetidas
    pdad_2021_domicilios %>%
      # Filtrar as colunas repetidas
      dplyr::select(-c(A01ra,A01setor)),
by=c("A01nficha"="A01nficha"))

O resultado é exatamente o mesmo, mas o aviso de junção é inibido, uma vez que informamos a condição desejada. Se houvesse mais de uma condição, basta adicioná-las à direita, separando-as por vírgulas (e.g. by=c("A01nficha"="A01nficha","A01ra"="A01ra")).

Atenção: para que o join seja realizado, o tipo da variável deve ser o mesmo. Por exemplo, se a chave de identificação for do tipo integer em uma base e do tipo numeric na outra, o join não será realizado. O mesmo vale para chaves do tipo character e integer ou numeric.

Agora que aprendemos a fazer a junção das bases de dados, vamos trazer as informações de inflação e renda domiciliar, construídas anteriormente e aproveitar para atualizar os valores monetários.

pdad <- pdad %>%
  dplyr::mutate(endtime=lubridate::ymd(endtime),
                # Extrair o valor do mês
                mes=lubridate::month(endtime,label=F),
                # Extratir o valor do ano
                ano=lubridate::year(endtime)) %>%
  # Trazer as informações de renda
  dplyr::left_join(renda_domiciliar) %>%
  # Trazer as infomações de inflação
  dplyr::left_join(inflacao_df) %>%
  # Criar as variáveis monetárias em termos reais
  dplyr::mutate(renda_dom_real=renda_dom*inflator,
                renda_dom_pc_real=renda_dom_pc*inflator)

Vamos agora declarar o plano amostral da PDAD 2021. Para isso, vamos precisar de algumas informações básicas:

  • O inverso da fração amostral, conforme o sorteio em um determinado estrato: PESO_PRE;
  • O estrato utilizado para pós-estratificação: POS_ESTRATO;
  • A população total de cada pós-estrato: POP_AJUSTADA_PROJ;
  • O código único de identificação da unidade de amostragem: A01nficha.

A PDAD 2021 foi pós-estratificada de modo a refletir os totais populacionais projetados para os recortes territoriais considerados na pesquisa, por sexo e faixas etárias (quinquenais até 74 anos e 75 ou mais).

O primeiro passo é criarmos o desenho inicial da pesquisa.

# Carregar os pacotes necessários
library(survey)
library(srvyr)

# Declarar o desenho incial
sample.pdad <- 
  survey::svydesign(id = ~A01nficha, # Identificador único da unidade amostrada
                    strata = ~A01setor, # Identificação do estrato
                    weights = ~PESO_PRE, # Inverso da fração amostral
                    nest=TRUE, # Parâmetro de tratamento para os IDs dos estratos
                    data=pdad # Declarar a base a ser utilizada
                    )

# Criar um objeto para pós estrato
post.pop <- pdad %>%
  dplyr::group_by(POS_ESTRATO) %>% # Agrupar por pós-estrato
  dplyr::summarise(Freq=max(POP_AJUSTADA_PROJ)) # Capturar o total da população

# Declarar o objeto de pós-estrato
# Estamos dizendo nesse passo qual é a população alvo para cada
# pós-estrato considerado
sample.pdad <- survey::postStratify(sample.pdad,~POS_ESTRATO,post.pop)

# Criar objeto para calcular os erros por bootstrap (Rao and Wu’s(n − 1) bootstrap)
# J. N. K. Rao and C. F. J. Wu - Journal of the American Statistical Association
# Vol. 83, No. 401 (Mar., 1988), pp. 231-241
amostra <- survey::as.svrepdesign(sample.pdad, type = "subbootstrap")

# Ajustar para tratamento de estratos com apenas uma UPA (adjust=centered)
options(survey.lonely.psu = "adjust")

# Ajustar objeto de amostra, para uso com o pacote srvyr (como tibble)
amostra <- srvyr::as_survey(amostra)

Pronto! Já temos o objeto com as informações da PDAD que iremos trabalhar no restante desta oficina. Vamos testar estimando o total de pessoas com 18 anos ou mais de idade no Distrito Federal. O nosso objeto base agora será o amostra, com o qual utilizaremos o pacote srvyr. Com a parâmetro vartype='ci', obtemos as estimativas dos intervalos de confiança.

# População DF com mais de 18 anos
pop18 <- 
amostra %>%
  # Filtrar somente a população com 18 anos ou mais de idade
  srvyr::filter(idade>=18) %>%
  # Criar uma variável auxiliar para contagem
  srvyr::mutate(count=1) %>%
  # Calcular o total da população, com seu intervalo de confiança
  srvyr::summarise(n=survey_total(count, vartype = "ci"))

Verificamos que existiam entre 2.267.893 e 2.305.487 pessoas com mais de 18 anos no DF em 2018, sendo o valor pontual de 2.286.690 pessoas. Caso o desejo fosse estimar esse mesmo total por sexo, isso poderia ser feito com a função group_by(). Vamos aproveitar e calcular o percentual de cada grupo no total.

amostra %>%
  # Filtrar somente a população com 18 anos ou mais de idade, retirando os códigos de não informação
  srvyr::filter(idade>=18) %>%
  # Ajustar a variável de sexo
  srvyr::mutate(E04=factor(case_when(E04==1~"Masculino",
                                     TRUE~"Feminino"))) %>%
  # Informar o grupo que queremos a informação
  srvyr::group_by(E04) %>%
  # Calcular o total e o Percentual da população, com seu intervalo de confiança
  srvyr::summarise(n=survey_total(vartype = "ci"),
                   # Calcular o percentual da população
                   pct=survey_mean(vartype = "ci"))

Note que, desta vez, não foi preciso criar um contador. Quando utilizamos a função de agrupamento de um fator, seguida da função de sumarização, os totais e percentuais são calculados sem a necessidade de informar o argumento.

Vamos calcular a renda domiciliar nominal e real para Distrito Federal, agora considerando a expansão do resultado. Mas, antes, precisamos declarar o plano amostra de domicílios. Nesta edição, diferentemente da edição de 2018, existe uma expansão exclusiva para os domicílios. Para tanto, utilizaremos somente uma informação por domicílio, utilizando como filtro o responsável pelo domicílio. Cada domicílio tem apenas um responsável, que, no caso da PDAD 2021, nada mais é que a pessoa com a qual se constrói as relações de parentesco e convivência dentro do domicílio (variável E05).

# Fazer o desenho de domicílios
amostra_dom <- survey::svydesign(id = ~A01nficha, # Identificador do domicílio
                                 strata = ~A01setor, # Identificação do estrato
                                 weights = ~PESO_PRE, # Inverso da fração amostral
                                 nest=TRUE,  #Parâmetro de tratamento para os IDs dos estratos
                                 data=pdad %>%
                                   dplyr::filter(E05==1) # Base de dados, pegando apenas uma informação por domíclio.
                                 )

#Criar um objeto para pós estrato
post.pop <- pdad %>%
  dplyr::filter(E05==1) %>% # Filtrar somente para uma obervação
  dplyr::group_by(A01setor) %>% # Agruprar por estrato
  dplyr::summarise(Freq=first(TOT_DOM)) %>% # Pegar uma única informação do total de domicílios no estrato
  dplyr::ungroup() # Desgrupar a base

# Declarar o objeto de pós-estrato
amostra_dom <- survey::postStratify(amostra_dom,~A01setor,post.pop)

# Criar objeto para calcular os erros por bootstrap (Rao and Wu’s(n − 1) bootstrap)
amostra_dom <- survey::as.svrepdesign(amostra_dom, type = "subbootstrap")

# Criar o objeto amostra ddo tipo tibble
amostra_dom <- srvyr::as_survey(amostra_dom)

Feito isso, vamos calcular os resultados.

amostra_dom %>%
  # Retirar os valores zerados
  srvyr::filter(renda_dom!=0) %>% 
  # Calcular a renda domiciliar real média do DF
  srvyr::summarise(renda_dom_real=survey_mean(renda_dom_real,na.rm=T,vartype="ci"),
                   renda_dom=survey_mean(renda_dom,na.rm=T,vartype="ci"))

Por essa metodologia, a renda domiciliar nominal estimada foi de R$ 7.121, com intervalo de R$ 7.006 e R$ 7.237. Em termos reais (Dezembro/2021), o valor estimado é de R$ 7.353, com intervalo de R$ 7.234 a R$ 7.473.

Outras manipulações recorrentes

Vamos agora elencar algumas variáveis para construirmos um pequeno relatório. Vamos construir gráficos e tabelas para: população, por faixa etária e sexo; distribuição do rendimento do trabalho (nominal), por faixas; e tipo de esgotamento sanitário do domicílio. E montar um mini relatório com essas informações.

As informações serão criadas com a função mutate(), as faixas de idade e de rendimento serão criadas com auxílio da função cut(). Ao final, utilizaremos a função mutate_if() para transformar as variáveis do tipo caracter em fator e, por fim, utilizaremos a função select() para selecionar as variáveis desejadas. Para criar as faixas de rendimento, consideraremos o número de salários mínimos, vigente em 2021.

# Criar um objeto com o salário mínimo em 2021
sm <- 1100

# Criar um objeto com as variáveis de interesse
vars_relatorio <- amostra %>%
  # Criar variável de sexo
  srvyr::mutate(sexo=case_when(E04==1~"Masculino",
                               E04==2~"Feminino"),
                # Criar variável de faixas de idade
                idade_faixas=cut(idade,
                                 breaks = c(-Inf,seq(4,74,by=5),Inf),
                                 labels = c("0 a 4 anos","5 a 9 anos",
                                            "10 a 14 anos","15 a 19 anos",
                                            "20 a 24 anos","25 a 29 anos",
                                            "30 a 34 anos","35 a 39 anos",
                                            "40 a 44 anos","45 a 49 anos",
                                            "50 a 54 anos","55 a 59 anos",
                                            "60 a 64 anos","65 a 69 anos",
                                            "70 a 74 anos","Mais de 75 anos"),
                                 ordered_result = T),
                # Criar variável de faixas de salário do trabalho principal
                faixas_salario=cut(case_when(I20 %in% c(77777,88888,99999)~NA_real_,
                                             TRUE~as.numeric(I20)),
                                   breaks = c(-Inf,sm,2*sm,4*sm,10*sm,20*sm,Inf),
                                   labels = c("Até 1 salário","Mais de 1 até 2 salários",
                                              "Mais de 2 até 4 salários",
                                              "Mais de 4 até 10 salários",
                                              "Mais de 10 até 20 salários",
                                              "Mais de 20 salários")),
                # Criar variável para as RAs
                RA=factor(A01ra,
                            levels=1:33,
                            labels=c('Plano Piloto',      
                                     'Gama',
                                     'Taguatinga',
                                     'Brazlândia',
                                     'Sobradinho',
                                     'Planaltina',
                                     'Paranoá',
                                     'Núcleo Bandeirante',
                                     'Ceilândia',
                                     'Guará',
                                     'Cruzeiro',
                                     'Samambaia',
                                     'Santa Maria',
                                     'São Sebastião',
                                     'Recanto das Emas',
                                     'Lago Sul',
                                     'Riacho Fundo',
                                     'Lago Norte',
                                     'Candangolândia',
                                     'Águas Claras',
                                     'Riacho Fundo II',
                                     'Sudoeste/Octogonal',
                                     'Varjão',
                                     'Park Way',
                                     'SCIA-Estrutural',
                                     'Sobradinho II',
                                     'Jardim Botânico',
                                     'Itapoã',
                                     'SIA',
                                     'Vicente Pires',
                                     'Fercal',
                                     'Sol Nascente/Pôr do Sol',
                                     'Arniqueira'))) %>%
  # Transformar em fator variáveis do tipo character
  srvyr::mutate_if(is.character,list(~factor(.))) %>%
  # Selecionar as variáveis criadas e algumas variáveis auxiliares
  srvyr::select(RA,E05,idade,I05,sexo,idade_faixas,faixas_salario)

Criado esse objeto auxiliar com as variáveis desejadas, vamos calcular os totais para cada um dos grupos, juntamente com seus intervalos de confiança. Para isso, vamos utilizar as funções group_by(), para conseguirmos agrupar os dados pelas categorias desejadas e a função summarise(), que calculará os totais ou proporções para cada grupo. Os intervalos de confiança são calculados com a função vartype="ci".

# Construir um objeto com as idades calculadas, por faixas de idade e sexo
# para montarmos a pirâmide etária
piramide <- vars_relatorio %>%
  # Agrupar por faixas de idade e sexo
  srvyr::group_by(idade_faixas,sexo) %>%
  # Calcular os totais
  srvyr::summarise(n=survey_total(na.rm = T, vartype = "ci"))

# Fazer o gráfico com a pirâmide
piramide_grafico <- piramide %>%
  # Construir um plot com as idades no eixo x, as quantidades no eixo y,
  #  preenchimento com a variável sexo, e os intervalos de confiança
  # inferiores e superiores
  ggplot(aes(x=idade_faixas,y=n, fill=sexo, ymin=n_low,ymax=n_upp))+
  # Fazer o gráfico de barras para o sexo Feminino
  geom_bar(data = dplyr::filter(piramide, sexo == "Feminino"),
           stat = "identity") +
  # Fazer o gráfico de barras para o sexo Masculino
   geom_bar(data = dplyr::filter(piramide, sexo == "Masculino"),
           stat = "identity",
           position = "identity",
           # Negativar os valores para espelhar no eixo
           mapping = aes(y = -n))+
  # Plotar os erros para o sexo Masculino, negativando os valores para espelhar o eixo
  geom_errorbar(data = dplyr::filter(piramide, sexo == "Masculino"),
                mapping = aes(ymin = -n_low,ymax=-n_upp),
                  width=0,
                color="black")+
  # Plotar os erros para o sexo Feminino
    geom_errorbar(data = dplyr::filter(piramide, sexo == "Feminino"),
                  width=0,
                color="black")+
  # Inverter os eixos, fazendo com que o gráfico de colunas verticais fique
  # horizontal
  coord_flip() + 
  # Ajustar as configurações de escala
  scale_y_continuous(labels = function(x) format(abs(x), 
                                                 big.mark = ".",
                                                 scientific = FALSE,
                                                 decimal.mark=",")) +
  # Suprimir os nomes dos eixos
  labs(x="",y="") +
  # Suprimir o nome da legenda
  scale_fill_discrete(name = "")

# Plotar gráfico
piramide_grafico

Para montar a pirâmide, usamos duas vezes a função geom_bar(), uma para desenhar a distribuição etária feminina e outra a masculina. Como o formato desejado é a pirâmide, escolhemos uma das categorias e negativamos seus valores, para que ela seja apresentada na direção oposta da abscissa. O mesmo procedimento deve ser adotado para as informações dos erros amostrais, desenhados com a função geom_errorbar(). Para que as informações sejam apresentadas em barras horizontais, ao invés de verticais, usamos a função coord_flip(), que inverte as coordenadas do gráfico. Por fim, realizamos alguns ajustes de apresentação das informações, retirando os nomes dos eixos com a função labs(), retirando o nome da legenda com a função scale_fill_discrete() e alterando a formatação numérica dos labels com a função scale_y_continuos(). Note que, para isso, criamos uma função com uma série de argumentos de formação: valor absoluto abs(), alteramos a forma de exibição do separador decimal e acrescentamos um separador de milhar por ponto.

Para construir o gráfico com os salários, os passos são análogos aos realizados para construção do gráfico anterior. A única diferença é que agora utilizamos a função theme() para retirar a legenda da apresentação dos dados.

# Construir um objeto com as informações de salário
salario <- vars_relatorio %>%
  # Agrupar por faixas de salário
  srvyr::group_by(faixas_salario) %>%
  # Calcular os totais para cada grupo de salário
  srvyr::summarise(n=survey_total(na.rm=T,vartype = "ci")) %>% 
  # Retirar NA
  na.omit

# Construir um objeto com o gráfico
salario_grafico <- salario %>%
  # Plotar os eixos x e y
  ggplot(aes(x=faixas_salario, y=n))+
  # Construir o gráfico de barras
  geom_bar(stat = "identity") +
  # Construir as barras de erro
  geom_errorbar(aes(ymin=n_low,ymax=n_upp,size=4, width=0), color="darkred")+
  # Inverter os eixos
  coord_flip()+
  # Suprimir o nome dos eixos
  labs(x="",y="")+
  # Retirar o título da legenda
  theme(legend.position="none")+
  # Ajustar as formatações de escala
  scale_y_continuous(labels = function(x) format(abs(x), 
                                                 big.mark = ".",
                                                 scientific = FALSE,
                                                 decimal.mark=","))

# Plotar gráfico
salario_grafico

Caso o desejo fosse saber a situação de salários por RA, poderíamos fazer isso facilmente com a função facet_wrap(). Vamos ver como funciona, agora calculando o percentual de pessoas em cada faixa de rendimento, para as 33 RAs.

# Carregar o pacote Scales
library(scales)

# Construir o objeto com os valores
salario2 <- vars_relatorio %>%
  # Filtrar somente para casos válidos
  srvyr::filter(is.na(faixas_salario)==FALSE) %>% 
  # Agrupar por RA e faixas de salário
  srvyr::group_by(RA,faixas_salario) %>%
  # Calcular as proporções por faixa de salário
  srvyr::summarise(n=survey_mean(na.rm=T,vartype = "ci")) %>% 
  # Retirar NA
  na.omit

# Construir o gráfico
salario2 %>%
  # Plotar os eixos x e y
  ggplot(aes(x=faixas_salario, y=n))+
  # Construir o gráfico de barras
  geom_bar(stat = "identity") +
  # Construir o gráfico com os erros
  geom_errorbar(aes(ymin=n_low,ymax=n_upp, group=RA),size=1,width=0, color="darkred")+
  # Inverter os eixos
  coord_flip()+
  # Suprimir o nome dos eixos
  labs(x="",y="")+
  # Suprimir o nome da legenda
  theme(legend.position="none")+
  # Ajustar as formatações de escala
  scale_y_continuous(labels = scales::percent)+
  # Plotar o gráfico para cada uma das RAs, divididas em 4 colunas
  facet_wrap(.~RA, ncol=4)

Para o último gráfico, como estamos realizando uma estatística para o domicílio, precisamos filtrar para selecionarmos apenas a informação do chefe (cujo peso é utilizado para expandir os resultados domiciliares). Fazemos isso com auxílio da função filter(). Como maneira de facilitar a leitura dos dados, adicionamos os valores exatos de cada coluna com a função geom_text().

# Construir o objeto com o esgotamento sanitário
esgotamento <- amostra_dom %>%
  srvyr::mutate(# Criar variável de esgotamento sanitário
                esgotamento_caesb=factor(case_when(B14_1==1~"Com Rede Geral (Caesb)",
                                                   B14_1==2~"Sem Rede Geral (Caesb)"))) %>% 
  # Agrupar por situação de esgotamento sanitário
  srvyr::group_by(esgotamento_caesb) %>%
  # Calcular a proporção de cada grupo
  srvyr::summarise(n=survey_mean(na.rm = T,vartype = "ci"))

# Construir o objeto com o gráfico
esgotamento_grafico <- esgotamento %>%
  # filtrar para valores válidos
  srvyr::filter(is.na(esgotamento_caesb)==FALSE) %>% 
  # Plotar os eixos x e y, reordenando os fatores, do maior para o menor resultado
  ggplot(aes(x=fct_reorder(esgotamento_caesb,-n),y=n,ymin=n_low,ymax=n_upp))+
  # Construir o gráfico de barras
  geom_bar(stat = "identity")+
  # Construir os erros
  geom_errorbar(size=4, width=0,
                color="black")+
  # Ajustar os nomes dos eixos
  labs(x="",y="% Domicílios")+
  # Retirar o nome da legenda
  theme(legend.position="none")+
  # Ajustar a formatação dos rótulos
  scale_y_continuous(labels = scales::percent)+
  # Inserir informações dos resultados no gráfico
  geom_text(aes(label = paste0(round(100*n,0),"%")),
                size=4, fontface = "bold", 
                vjust = -0.25,hjust=1.25)

# Plotar grafico
esgotamento_grafico

Vamos ver como fazer um gráfico de setores, com as mesmas informações anteriores. Note que, para fazer esse tipo de gráfico, perderemos as informações dos intervalos de confiança. Para que o gráfico fique mais elegante, criamos um tema retirando todos os elementos básicos, atribuindo-o a um objeto chamado tema_branco. Para esse tipo de gráfico, precisamos da função coord_polar(), para colocar o gráfico em coordenada polar. Com isso, o posicionamento dos rótulos ficam um pouco mais complexos, sendo necessário criar uma variável com a posição do label.

# Carregar o pacote ggrepel
library(ggrepel)

# Construir o objeto com as informações de esgotamento sanitário
esgotamento2 <- amostra_dom %>%
  srvyr::mutate(# Criar variável de esgotamento sanitário
                esgotamento_caesb=factor(case_when(B14_1==1~"Com Rede Geral (Caesb)",
                                                   B14_1==2~"Sem Rede Geral (Caesb)"))) %>% 
  # Filtar para o responsável
  srvyr::filter(is.na(esgotamento_caesb)==FALSE) %>%
  # Agrupar por tipo de esgotamento
  srvyr::group_by(esgotamento_caesb) %>%
  # Calcular as proporções
  srvyr::summarise(n=survey_mean(na.rm = T,vartype = "ci")) %>%
  # Deixar as informações em ordem decrescente
  dplyr::arrange(-n) %>%
  # Construir uma variável auxiliar, com a posição do label
  dplyr::mutate(pos=cumsum(n)-n/8)

# Criar o tema branco, eliminando todos os elementos gráficos padrões
tema_branco <- theme_minimal()+
  theme(
    # Retirar título do eixo x
    axis.title.x = element_blank(),
    # Retirar título do eixo y
    axis.title.y = element_blank(),
    # Retirar as bordas no painel
    panel.border = element_blank(),
    # Retirar elementos textuais do eixo y
    axis.text.y = element_blank(),
    # Retirar demais elementos textuais dos eixos
    axis.text = element_blank(),
    # Retirar as linhas de grade
    panel.grid=element_blank(),
    # Retirar os ticks
    axis.ticks = element_blank())

# Construir o gráfico de pizza
esgotamento2 %>%
  # Plotar o gráfico, com as quantidades no eixo y, o preenchimento com as categorias,
  # reordenando as quantudades, e o valor 1 para travar o eixo x
  ggplot(aes(x=1,y=n,fill=fct_reorder(esgotamento_caesb,n)))+
  # Construir as "barras"
  geom_bar(stat="identity")+
  # Transformar em coordenada polar o eixo y, com início em 0
  coord_polar("y", start=0)+
  # Retirar os nomes dos eixos
  labs(x="",y="") +
  # Adicionar o tema branco
  tema_branco+
  # Retirar o nome da legenda
  scale_fill_discrete(name="")+
  # Adicionar o label com os valores, usando a função repel para evitar
  # sobreposições
  geom_text_repel(aes(label = percent(n), y=pos), size=5, color="white",
                  fontface="bold")

Alternativamente ao gráfico de setores, podemos fazer um gráfico de coluna agrupada, que fornece o mesmo tipo de informação para este caso.

# Construir o objeto com as informações de esgotamento sanitário
amostra_dom %>%
  srvyr::mutate(# Criar variável de esgotamento sanitário
                esgotamento_caesb=factor(case_when(B14_1==1~"Com Rede Geral (Caesb)",
                                                   B14_1==2~"Sem Rede Geral (Caesb)"))) %>% 
  # Filtar para o responsável
  srvyr::filter(is.na(esgotamento_caesb)==FALSE) %>%
  # Agrupar por tipo de esgotamento
  srvyr::group_by(esgotamento_caesb) %>%
  # Calcular as proporções
  srvyr::summarise(n=survey_mean(na.rm = T,vartype = "ci")) %>%
  # Gerar uma área de plotage,
  ggplot()+
  # Gerar a geometria da barra
  geom_bar(aes(x=1,y=n,fill=esgotamento_caesb),stat = "identity",alpha=0.5) +
  # Adicionar os percentuais ao gráfico, na forma de texto
  geom_text(aes(x=1, label = paste0(format(abs(round(n*100)), 
                                                 big.mark = ".",
                                                 scientific = FALSE,
                                                 decimal.mark=","),"%"),
                    y= n,
                group = esgotamento_caesb),
            size=4, 
            fontface = "bold",
            color = "black",
            position = position_stack(vjust = .5)) +
  # Retirar o nome da legenda
  scale_fill_discrete(name="")+
  # Ajustar o label da escala y
  scale_y_continuous(labels = scales::percent)+
  # Retirar o rótulo dos eixos
  labs(x="",y="")+
  # Retirar as informações do eixo x
  theme(axis.line.x = element_blank(),
        axis.ticks.x = element_blank(),
        axis.text.x=element_blank())

Criando relatórios com o Rmarkdown

Agora que fizemos todos esses objetos contendo nossos gráficos, vamos criar um pequeno relatório com essas informações. Para isso, vamos precisar salvar nossos objetos, para que não seja necessário criarmos todos eles novamente dentro do documento. Basicamente, podemos salvar os objetos do R em alguns formatos, como o rda e o rds, ou em formatos utilizados por outros softwares estatísticos, com o pacote foreign. Uma maneira rápida de salvar todos os seus objetos disponíveis no ambiente em um único arquivo é utilizando a função save.image(). Utilize a opção compress = T para reduzir o tamanho do arquivo a ser criado. Para salvar somente os objetos de interesse, utilize a função save().

# Salvar um arquivo com todos os objetos
save.image("dados/objetos.rda", compress = T)
# Remover todos os objetos do ambiente
# rm(list = ls())
# Carregar os objetos salvos
load("dados/objetos.rda")
# Salvar somente objetos de interesse
# save(list=c("piramide","esgotamento","salario"),
#      file="dados/objetos.rda")

Muitas vezes não precisamos salvar todo o nosso diretório e queremos apenas salvar um objeto específico, como um determinado banco de dados ou apenas os objetos que iremos utilizar no nosso relatório. Para isso, utilizamos a função saveRDS(). Vamos salvar os três gráficos que criamos anteriormente, neste formato.

# Salvar os objetos no formato RDS
saveRDS(piramide,"dados/piramide.rds")
saveRDS(esgotamento,"dados/esgotamento.rds")
saveRDS(salario,"dados/salario.rds")

Feito isso, agora vamos criar nosso relatório. Para isso, abra um novo arquivo R markdown, clicando no atalho para novo arquivo -> R Markdown. Selecione a opção PDF, escolha um nome para o arquivo e clique em ok.

Os arquivos gerados no R em pdf são baseados na linguagem \(\LaTeX\). Assim, é possível adicionar os pacotes e definições utilizados no \(\LaTeX\) diretamente no R. Os relatório básicos já estão pré-configurados no R, sem que sejam necessários maiores ajustes.

Assim que criamos um novo arquivo, um modelo de relatório é automaticamente gerado. A estrutura básica é composta por um preâmbulo, no qual inserimos algumas informações sobre a estrutura e a configuração do markdown. Este preâmbulo fica encapsulado entre três traços ---, nos quais indicamos uma série de formatações, inclusive o tipo do output que será gerado, que é o PDF no nosso caso. Podemos gerar ainda documentos em word ou html. Este curso, por exemplo, foi escrito em um arquivo markdown, tendo como output o formato HTML.

Os códigos de R podem ser inseridos juntamente com os textos, dentro de acentos graves ``, com a primeira letra sendo o r. Podemos criar também os chunks, que são estruturas separadas para inserções no texto, como tabelas e figuras. Os chunks são encapsulados por uma sequência de três acentos graves```, sendo a parte superior composta ainda de parâmetros inseridos entre chaves {r}, iniciando com a letra r. Você pode criar chunks com outras linguagens de programação, como python, seguindo o exemplo abaixo.

# ```{python}
# 1+1
# ```
# `r rnow(pdad_2021_moradores)` Isto é um código r dentro de um texto markdown

# Abaixo temos um exemplo de chunk

#```{r}
# table(pdad_2021_moradores$A01ra)
#```

Os títulos das seções são criados com o símbolo #. Caso queiramos criar subseções, vamos adicionando sequências do mesmo símbolo.

Após ser escrito o relatório, precisamos compilar o documento, que é realizado com o auxílio dos pacotes knit e pandoc. O primeiro deles cria um arquivo com os elementos textuais e do R, no formato .md, que posteriormente é convertido para o formato desejado com o segundo pacote.

Rode o arquivo de exemplo, clicando no botão knit, para verificar o resultado. O RStudio pedirá para você indicar o nome e o local do arquivo a ser criado. Toda vez que você “tricotar” o documento, o R salva e executa todos os passos elencados anteriormente automaticamente.

Vamos agora criar o nosso relatório. Para isso, vamos utilizar apenas cinco pacotes do \(\LaTeX\), o babel, para conseguirmos produzir o relatório em português, o pacote inputenc, que cuidará do encoding dos caracteres, o float, que cuidará das imagens e os pacotes booktabs e tabu para a confecção das tabelas. Fazemos isso adicionando no preâmbulo do documento a linha header-includes:, indicando os pacotes do \(\LaTeX\) a serem utilizados. Qualquer outro pacote pode ser inserido neste espaço. Para rodar o relatório em PDF, você precisará ter alguma distribuição do TeX/LaTeX. Uma opção em Windows é MiKTeK. Durante a instalação, marque a opção “Install missing packages on-the-fly” como “yes”. O RStudio server já conta com uma instalação em sua máquina.

Comumente, utilizamos o primeiro chunk para inserir as configurações e opções a serem utilizadas no decorrer do documento. Note que utilizamos a opção include=FALSE para que este chunk não seja incluído no documento. Nele, carregamos os pacotes necessários, ajustamos as configurações padrão dos demais chunks, carregamos a base e ajustamos uma configuração do pacote kableExtra, que será utilizado para gerar nossas tabelas no formato \(\LaTeX\).

No meio do documento, podemos utilizar qualquer comando \(\LaTeX\), da mesma maneira que faríamos caso estivéssemos trabalhando com a ferramenta. Alguns atalhos facilitam uma série de formatações, como palavras em itálico, escritas entre asteriscos *palavra* e negrito, escritas entre duplos asteriscos **palavra**. Notas de rodapé são facilmente inseridas entre colchetes, precedido de um acento circunflexo ^[nota de rodapé].

Para inserirmos uma figura criada com o pacote ggplot, devemos “abrir” um chunk e chamar o objeto dentro dele. Para inserir o título da figura e seu respectivo label, utilizamos a opção fig.cap="Título", no início do chunk. O label deve ser adicionado por dentro do título, com o comando \\label{}, este último derivado do \(\LaTeX\). Repare que, neste caso, foi necessário inserir uma segunda barra invertida, de modo que o R entenda que estamos querendo utilizar um comando do \(\LaTeX\) dentro do chunk. Alternativamente, você pode nomear o chunk e utilizar como referência fig:nome do chunk. Para fazer referência ao elemento, utilize o comando \ref{} dentro do texto.

Para as tabelas, utilizamos o pacote knitr, usualmente em conjunto com o pacote kableExtra para customizarmos as tabelas. Diferentemente das figuras, este pacote já esta preparado para receber as informações de título em parâmetros específicos, convertendo o resultado para a linguagem \(\LaTeX\). Para algumas formatações adicionais, como separador de milhar, posicionamento da tabela e marcador decimal, a própria função kable() pode ser utilizada. Para referenciar as tabelas, utilize tab:nome do chunk. Abaixo está um exemplo de relatório, que deve ser executado em um arquivo .Rmd, bastando retirar os sustenidos.

# ---
# title: "Mini relatório da PDAD 2021"
# author: "Thiago Mendes Rosa"
# date: "`r Sys.Date()`"
# output:
#   pdf_document: default
#   word_document: default
# header-includes:
# - \usepackage[brazilian]{babel}
# - \usepackage[utf8]{inputenc}
# - \usepackage{float}
# - \usepackage{booktabs}
# - \usepackage{tabu}
# ---
# ```{r setup, include=FALSE}
# library(forcats)
# library(scales)
# knitr::opts_chunk$set(echo = F,fig.pos = 'H',warning=F)
# # Carregar objetos
# load("dados/objetos.rda")
# # Definir função para separador de milhar e decimal dos chunks
# knitr::knit_hooks$set(inline = function(x) {
#  prettyNum(x, big.mark=".",decimal.mark = ",")
# })
# options(kableExtra.latex.load_packages = FALSE)
# # Habilitar opção abaixo para gerar tabelas em word. Para tanto,
# # retirar o argumento "latex" da função "kable"
# #options(kableExtra.auto_format = FALSE)
# library(kableExtra)
# ```
# 
# # PDAD 2021
# 
# A PDAD 2021 visitou **`r nrow(pdad_2021_domicilios)`** domicílios e coletou informações de `r nrow(pdad_2021_moradores)` moradores.
# 
# ## Estrutura etária
# 
# A estrutura etária dos moradores do Distrito Federal é apresentada  Figura \ref{fig:piramide}.
# 
# ```{r piramide, fig.cap="Pirâmide etária",out.extra=''}
# piramide_grafico
# ```
# 
# Os valores específicos podem ser verificados na tabela \ref{tab:piramide.tab}.
# 
# ```{r piramide.tab, results='asis'}
# piramide %>%
# knitr::kable("latex",
#             caption="Pirâmide etária",
#             booktabs = T,
#             digits = 0,
#             format.args=list(big.mark = ".",
#                              decimal.mark = ",")) %>%
#  kableExtra::kable_styling(latex_options = c("HOLD_position"),
#                            full_width=T) %>%
#  kableExtra::footnote(general_title ="",
#                       general="Fonte: PDAD 2021",
#                       fixed_small_size=T)
# ```
# \clearpage
# 
# ## Salários
# 
# No que diz respeito aos salários, sua distribuição por faixas de salário mínimo^[O salário considerado foi de R$ 1.100,00] é apresentada  Figura \ref{fig:salarios}.
# 
# ```{r salarios, fig.cap="Salarios por faixa de SM",out.extra=''}
# salario_grafico
# ```
# 
# Os dados podem ser consultados na Tabela \ref{tab:salarios.tab}.
# 
# ```{r salarios.tab, results='asis'}
# salario %>%
# knitr::kable("latex",
#             caption="Salarios por faixa de SM",
#             booktabs = T,
#             linesep = "",
#             format.args=list(big.mark = ".",
#                              decimal.mark = ",")) %>%
#  kableExtra::kable_styling(latex_options = c("HOLD_position"),
#                             full_width=T) %>%
#   kableExtra::column_spec(1,width = "5cm") %>% 
#  kableExtra::footnote(general_title ="",
#                       general="Fonte: PDAD 2021",
#                       fixed_small_size=T)
# ```
# \clearpage
# \pagebreak
# 
# ## Esgotamento
# 
# Por fim, o esgotamento sanitário é apresentado na Figura \ref{fig:esgotamento}
# 
# ```{r esgotamento, fig.cap="Esgotamento sanitário",out.extra=''}
# esgotamento_grafico
# ```
# 
# Os números podem ser consultados na Tabela \ref{tab:esgotamento.tab}.
# 
# ```{r esgotamento.tab, results='asis'}
# esgotamento %>% 
# knitr::kable("latex",
#             caption="Esgotamento sanitário",
#             booktabs = T,
#             digits = 2,
#             format.args=list(big.mark = ".",
#                              decimal.mark = ",")) %>%
#  kableExtra::kable_styling(latex_options = c("HOLD_position"),
#                             full_width=T) %>%
#   kableExtra::column_spec(1,width = "6cm") %>% 
#  kableExtra::footnote(general_title ="",
#                       general="Fonte: PDAD 2021",
#                       fixed_small_size=T)
# ``` 

O relatório criado em PDF pode ser facilmente gerado em outros formatos. Experimento clicar no botão knit, na seta para baixo, selecionando a opção Knit to Word. O relatório também pode ser gerado no formato HTML, todavia as tabelas necessitam de alguns ajustes neste caso. Devemos alterar o tipo da tabela para "html", com o argumento format, dentro da função knitr::kable(). Alternativamente, podemos utilizar as funções xtable::xtable() ou pander::pander().

Salvando seus resultados no Github

Para configurar suas credenciais no github, digite na aba do terminal os seguintes comandos:

  • git config --global user.name “seu nome de usuário”
  • git config --global user.email “seu e-mail”

Se quiser configurar sua senha, digite:

  • git config --global user.password “sua senha”

Depois de produzirmos nossos códigos, vamos subir as informações para o nosso repositório no GitHub. Para isso, temos três opões:

  • Clicar no botão de atalho do GitHub na barra superior
  • Clicar na janela superior à direita, na aba do Git
  • Usar o atalho de teclado Ctrl+Alt+M.

Pelo primeiro e terceiro métodos, a janela abaixo será exibida. Com o segundo método, a janela aparece depois de clicar no botão commit.

Com ela, verificamos todos os objetos que foram modificado, removido e/ou adicionados no diretório do projeto. A partir dele, devemos informar o que desejamos fazer com cada um deles. Podemos ignorá-los com o botão Ignore, para, neste caso, indicarmos que não desejamos que essa informação seja armazenada no repositório.

Para os arquivos que queremos armazenar, devemos selecionar e utilizar o botão Stage. Após selecionarmos os arquivos a serem enviados, devemos adicionar um cometário geral, para termos noção do que se refere aquela etapa do projeto, e utilizar o botão Commit. Com isso, nossos arquivos já estão prontos para serem enviados ao repositório. A última etapa consiste em utilizar o botão Push, que, após acionado, solicitará a confirmação do usuário e senha. Pronto! Seus scripts e arquivos já estão armazenados e versionados no Github. Caso queria continuar o projeto em outro local ou compartilhar as informações com alguém, basta a pessoa fazer um Pull do repositório.

Encerramento

Esse foi o mini-curso de R aplicado à PDAD. O R é uma ferramenta muito ampla, que permite diversas outras aplicações, principalmente na área estatística. Aqui foi apresentada uma modesta parcela das funcionalidades que esta ferramenta pode oferecer. Ainda há muito mais a ser explorado. Utilizar o R constantemente fará com que você acumule habilidades e avance cada vez mais na utilização desta ferramenta. O começo pode parecer desafiador, mas, uma vez rompida a barreira inicial, o avanço se torna natural e prazeroso.

Abaixo você tem uma lista de aplicações analíticas sendo realizadas atualmente com o auxílio do R, segundo o blog revolution analytics.

Expanda seus conhecimentos e compartilhe!

Análises

  • Matemática básica
  • Estatística básica
  • Distribuições de probabilidade
  • Análise de Big Data
  • Machine Learning
  • Otimização e programação matemática
  • Processamento de sinais
  • Simulações e Geração de números aleatórios
  • Modelagem estatística
  • Teste estatísticos

Visualização e gráficos

  • Gráficos estáticos
  • Gráficos dinâmicos
  • Mapas
  • Dispositivos e formatos

Aplicações em R e Extensões ***

  • Aplicações
  • Mineração de dados
  • Metodologia estatística

Qualquer dúvida, mande um e-mail para thiago.rosa@codeplan.df.gov.br.


  1. Exemplo extraído de: https://curso-r.github.io/ragmatic-book/principios.html#pipe.↩︎

  2. Em 2019, foram criadas duas novas Regiões Administrativas no Distrito Federal. A Lei Complementar nº 958, de 20 de dezembro de 2019 estabeleceu as poligonais de todas as regiões do DF.↩︎

  3. Conforme apontado anteriormente, a PDAD investiga domicílios particulares em áreas urbanas e áreas rurais com características urbanas. Assim sendo, todos os domicílios coletivos e aqueles situados em áreas rurais são desconsiderados na pesquisa.↩︎